Apex 调试与异常处理完全指南

Apex调试与异常处理完全指南:Debug Log(数据库操作/HTTP callout/Apex错误/资源使用/工作流/20MB限制+自动缩小/24h系统+7天监控保留/15min-1000MB禁用/频繁类日志导致请求失败)、日志节(SECTION_START+END/SOQL+DML+CALLOUT+USER_DEBUG+EXCEPTION+CUMULATIVE_LIMIT)、Log Category(7类)+Level(8级)、Trace Flag(类/触发器覆盖用户级别但不触发生成/优先级)、Log Inspector(时间线+执行概览+源代码链接+筛选器)、异常(throw+try+catch+finally/未处理异常回滚+用户错误消息+自动邮件通知)、10种内置异常(DmlException/NullPointerException/QueryException/SObjectException/LimitException/CalloutException/JSONException等)、Exception通用方法(4个)、DmlException逐记录方法(getNumDml+getDmlIndex+getDmlMessage+getDmlType+getDmlFieldNames+getDmlId)、多catch块(具体到一般顺序/异常链initCause)、自定义异常(extends Exception/Exception结尾/内部类/4隐式构造函数/重新抛出+异常转换)。...

📅 2026/7/16 ✍️ ponybai 🏷️ apex, salesforce

Apex 调试与异常处理

调试

Apex 通过 Developer Console 和调试日志提供调试支持。支持异常语句和自定义异常——未处理异常自动向开发者发送邮件通知。

Debug Log:概述与限制

Debug Log

Debug Log 记录事务或单元测试执行期间的数据库操作、系统流程和错误。内容涵盖:数据库变更、HTTP callout、Apex 错误、资源使用(Governor Limit)、自动化工作流流程(工作流规则/分配规则/审批流程/验证规则)。不包括基于时间的工作流触发的操作和 Visualforce 邮件模板控制器信息。

限制:每个日志最大 20MB——超出的日志通过移除旧日志行缩小(可能从任意位置移除 System.debug 语句)。系统日志保留 24 小时——监控日志保留 7 天。15 分钟内生成超过 1000MB 日志时跟踪标志被禁用——通知最后修改跟踪标志的用户(15 分钟后可重新启用)。频繁访问类或用户的日志跟踪标志启用可能导致请求失败。

Debug Log:节与结构

日志结构

Debug Log 包含多个节(Section):EXECUTION_STARTED/EXECUTION_FINISHED(执行边界)、CODE_UNIT_STARTED/CODE_UNIT_FINISHED(代码单元)、SOQL_EXECUTION_BEGIN/SOQL_EXECUTION_END(SOQL 查询)、DML_BEGIN/DML_END(DML 操作)、CALLOUT_REQUEST/CALLOUT_RESPONSE(HTTP callout详情)、USER_DEBUG(System.debug 输出)、EXCEPTION_THROWN(异常抛出)、CUMULATIVE_LIMIT_USAGE/CUMULATIVE_LIMIT_USAGE_END(Governor Limit 使用情况)。

Debug Log:类别、级别与事件类型

日志级别

Log Category(类别):Db(数据库操作)、Workflow、Validation、Callout、Apex Code、Apex Profiling、Visualforce、System。每个类别可设置独立 Log Level(NONE/ERROR/WARN/INFO/DEBUG/FINE/FINER/FINEST)。Trace Flag:为用户或类/触发器设置日志级别——类/触发器 Trace Flag 覆盖用户 Trace Flag 的日志级别但不触发日志生成。日志在实际执行时生成。

Log Inspector(Developer Console):交互式查看——时间线视图、执行概览(按时间排序的日志行+嵌套堆栈深度)、源代码链接(点击日志行跳转到对应代码行)。筛选器按类/触发器/操作过滤日志。日志优先级:类/触发器 Trace Flag > 用户 Trace Flag > 默认日志设置。

异常概述与 throw/try/catch/finally

异常

异常标记中断正常代码执行的错误和事件。throw 抛出异常,try/catch/finally 优雅恢复。未处理异常:如果异常未被捕获——Apex 事务回滚所有 DML 操作、用户看到错误消息、系统自动向开发者发送包含堆栈跟踪的邮件。finally 块始终执行——无论异常是否抛出或捕获。

异常语句结构:

try {
    // 可能抛出异常的代码
    Account a = new Account(Name='Test');
    insert a;  // 如果验证规则失败抛出 DmlException
} catch (DmlException e) {
    // 捕获特定异常类型
    System.debug('DML Error: ' + e.getMessage());
    for (Integer i = 0; i < e.getNumDml(); i++) {
        System.debug('Record ' + i + ': ' + e.getDmlMessage(i));
    }
} catch (Exception e) {
    // 捕获所有其他异常
    System.debug('General Error: ' + e.getTypeName() + ': ' + e.getMessage());
    System.debug('Stack: ' + e.getStackTraceString());
} finally {
    // 始终执行——清理资源
}

内置异常与常用方法

异常方法

常用内置异常:DmlException(DML 操作失败——单条记录/批量记录)、NullPointerException、QueryException(SOQL/SOSL 错误)、SObjectException(sObject 操作错误)、LimitException(Governor Limit 超出)、CalloutException、JSONException、MathException(数学运算错误)、TypeException(类型转换错误)、SecurityException、NoAccessException、AsyncException。

Exception 通用方法:getMessage()(错误消息)、getTypeName()(异常类型名)、getStackTraceString()(堆栈跟踪字符串)、getCause()(原因异常)、getLineNumber()(抛出异常的行号)。

DmlException:逐记录错误方法

DmlException

DmlException 支持逐记录错误检查——批量 DML 中部分记录可能失败:getNumDml()(失败的记录数)、getDmlIndex(i)(失败记录的原始索引)、getDmlMessage(i)(第 i 条失败记录的错误消息)、getDmlType(i)(失败操作类型——REQUIRED_FIELD_MISSING 等状态码)、getDmlFieldNames(i)(涉及错误的字段名列表)、getDmlId(i)(失败记录的 ID)。Database 类方法部分成功模式结合使用——逐条记录遍历 SaveResult 获取 id/errors 更为精准。

捕获不同异常类型

多种异常

多个 catch 块——从具体到一般:Apex 按出现顺序评估 catch 块——必须将最具体的异常类型放在前面。例如:DmlException → Exception(DmlException 是 Exception 的子类——如果 Exception catch 在前,DmlException catch 永远不执行)。

异常链:可以使用 initCause(Exception) 设置原因异常——getCause() 获取链接的异常。在 try 块中可以有 DML 操作(与 HTTP Callout Mock 不同——无 DML 前 Mock 限制)。

自定义异常与内部异常

自定义异常

自定义异常类:扩展 Exception 类——类名必须以 Exception 结尾。可以定义为内部类、可以包含成员变量和构造函数、可以有四个隐式内置构造函数。示例:public class AccountException extends Exception {}

重新抛出异常:在 catch 块中可以使用 throw ex; 重新抛出原异常或抛出新的自定义异常包裹原异常(异常转换)。自定义异常使错误信息更清晰——与具体业务场景对应。内置异常 + 自定义业务异常组合提供灵活的错误处理策略。

掌握 Debug Log 的结构和异常处理模式是高效排查 Apex 问题的核心技能——从日志分析到异常捕获,构成完整的调试和错误管理流程。