Aura启用的Apex方法中AuraHandledException与自定义异常的行为差异
Salesforce官方文档明确指出,Aura启用的Apex方法应抛出AuraHandledException来向客户端传递友好的错误信息,但不少代码库会使用自定义异常类。以下是两者的核心行为差异及适用场景说明:
核心行为差异
1. 调试日志表现
你已经观察到的差异是最直观的:
- 抛出
AuraHandledException时,调试日志的Status列会显示固定内容:Script-thrown exception. - 抛出自定义异常时,调试日志的Status列会直接显示你传入的错误信息(比如
Something went wrong)
2. 框架处理逻辑
AuraHandledException是Salesforce专为Aura组件设计的异常类,它的核心作用是明确告知框架这是一个需要传递给客户端的业务级错误,不会触发后端的未处理异常告警(比如异常邮件通知、系统错误统计)。
而自定义异常默认会被框架视为未处理的系统级异常——虽然客户端可能能拿到错误信息,但后端会将其标记为异常事件,可能触发不必要的监控告警。
3. 客户端错误传递细节
虽然你看到客户端错误体结构相似,但AuraHandledException能确保错误信息被框架原样传递给客户端,不会被包装成通用的系统错误。自定义异常如果直接抛出,在某些场景下(比如异常未被Apex层捕获),框架可能会返回更笼统的错误提示,导致客户端无法展示精准的业务提示。
适用场景示例
场景1:直接使用AuraHandledException
当你需要向Aura客户端传递精准的业务友好提示,且不希望触发后端异常告警时,直接用AuraHandledException:
@AuraEnabled public static void updateAccount(Id accId, String newName) { try { Account acc = [SELECT Id, Name FROM Account WHERE Id = :accId LIMIT 1]; if (acc.Name == newName) { // 业务逻辑错误:名称未变更 throw new AuraHandledException('账户名称未发生变更,请修改后重试'); } acc.Name = newName; update acc; } catch (QueryException e) { // 捕获系统异常,包装为友好提示 throw new AuraHandledException('未找到指定账户,请检查账户ID是否正确'); } }
这种情况下,客户端可以直接捕获异常并展示给用户,后端日志不会将其标记为严重错误。
场景2:自定义异常用于后端分层处理
当你需要在Apex内部区分不同类型的业务错误,实现更精细的异常处理逻辑时,用自定义异常,最后统一包装成AuraHandledException传递给客户端:
// 自定义异常类:用于标记账户更新相关的业务错误 public class AccountUpdateException extends Exception {} @AuraEnabled public static void updateAccount(Id accId, String newName) { try { validateAccountUpdate(accId, newName); Account acc = [SELECT Id, Name FROM Account WHERE Id = :accId LIMIT 1]; acc.Name = newName; update acc; } catch (AccountUpdateException e) { // 捕获自定义业务异常,转为Aura可处理的异常传递给客户端 throw new AuraHandledException(e.getMessage()); } catch (Exception e) { // 其他系统异常,返回通用提示 throw new AuraHandledException('账户更新失败,请稍后重试'); } } // 独立的校验逻辑,用自定义异常标记业务错误 private static void validateAccountUpdate(Id accId, String newName) { if (String.isBlank(newName)) { throw new AccountUpdateException('账户名称不能为空'); } if (accId == null) { throw new AccountUpdateException('账户ID不能为空'); } }
这里自定义异常用于后端内部的错误分类,让业务逻辑更清晰,最后再通过AuraHandledException确保客户端能收到友好提示,同时避免后端告警。
如果你的自定义异常仅用于后端内部逻辑(不需要传递给客户端),也可以直接抛出,但在Aura启用的方法中,建议最终都转为AuraHandledException,避免客户端收到不友好的系统级错误。
内容的提问来源于stack exchange,提问作者HG_

