Apex 的异常处理

时间:2024-07-25 23:06:44

Apex 中的异常处理

在 Apex 中,和其他语言类似,对于异常处理通常使用 try、catch、finally、throw 等关键字。

对于每一个 try 代码段,必须要有至少一个 catch 或 finally 代码段,而 finally 代码段最多只能有一个。

finally 代码段是必然会执行的代码段,无论异常有没有发生。

异常处理的结果

当发生异常后,代码执行会终止,而在此异常之前所有的数据库 DML 操作都会回滚,无论是否已经在此之前设定了“保存点(SavePoint)”。

与此同时,相关的错误信息会写入日志,用户可以在“设置”界面下的 “Debug Logs” 选项中进行查看。错误信息也会显示在用户界面中。

异常类型

系统定义的异常类型有:

  • DmlException:关于数据库操作的异常
  • ListException:关于列表操作的异常
  • NullPointerException:关于空指针的异常
  • QueryException:关于查询语句的异常
  • SObjectException:关于SObject对象的异常

它们共有的方法包括:

  • getCause():给出异常原因
  • getLineNumber():给出发生异常的行数
  • getMessage():给出异常的详细信息
  • getStackTraceString():给出异常发生的栈信息
  • getTypeName():给出异常的类型,比如 DmlException、NullPointerException 等

对于每个异常类型,还有自己的方法,比如 DmlException 就拥有 getDmlFieldNames()、getDmlMessage() 等方法。

标准格式

try {
// 执行操作,有可能发生异常
} catch(DmlException e) {
// 捕捉 DML 相关的异常
} catch(SObjectException e) {
// 捕捉 SObject 相关的异常
} catch(Exception e) {
// 发生异常之后,在此进行后续处理
} finally {
// 其他的操作,必然会执行的代码段
}

如果要捕捉不同的异常类型,要将“一般异常类型”(Exception)放在最后。

自定义异常类型

对于系统自定义的异常类型,只能使用 catch 来捕捉,而不能使用 throw 语句来抛出。开发者也可以定义自己的异常类型。

自定义异常类型也是一个类,必须继承 Exception 类或其任何子类。

自定义异常类型的名字必须以 Exception 结尾。

标准格式:

public class BaseException extends Exception {}

public class ExampleException extends BaseException {}

...

// 抛出异常类
throw new BaseException(); // 抛出异常类并加上错误信息
new ExampleException('An error occurred.'); // 抛出异常类并嵌套异常类变量
try {
throw new BaseException('First exception');
} catch (BaseException e) {
throw new ExampleException('Thrown with inner exception', e);
}