课程章节介绍
同学们,今天我们来聊聊Apex里怎么处理异常,也就是程序出错时该怎么优雅地应对。
其实整个思想很简单,就三步:发现问题就,抛出,一个异常对象,然后想办法,捕获,它,最后不管有没有错都要,收尾,。
先看抛出。
当你发现某个情况不应该继续执行,比如账户余额不足,你就可以用 `throw` 关键字,加上一个异常对象,把错误信号发出去。
比如 `throw new MyCustomException('余额不足');`,这就像你举起一个红牌,告诉系统:“这儿出问题了,后面的代码先别执行。”
那抛出之后,谁来接这个红牌呢?这就是 `try/catch/finally` 结构的作用。
`try` 里面放你“觉得可能出错”的代码。一旦里面有异常抛出,运行就会立刻跳到 `catch` 块。
`catch` 就像一个一个的捕手,每个捕手只抓一种特定的异常类型。
而且顺序很严格——,一个 catch 只能对应一种异常类型,类型还不能重复,。
异常对象来的时候,系统会从上往下找,先看第一个 `catch` 的类型是否匹配;一匹配上,就执行这个 `catch` 里的代码,后面的 `catch` 全部跳过,再也不会看了。
所以你必须把最特殊的异常放前面,把最一般的异常放最后。
一般我们会在最后放一个 `catch(Exception e)`,这个 `Exception` 是万能捕手,无论什么异常它都能接住。但是记住:它只能做最后一个,不然其他捕手就没机会上场了。
`finally` 块又是怎么回事呢?
它就像一个负责任的管家:,无论如何,最后都要执行,。
就算 `try` 里没有异常,或者异常被捕获了,甚至就算异常没被捕获又被抛出去了,`finally` 也一定会跑。
所以我们通常把清理工作放在这儿——关掉文件流、释放资源、删除临时数据,这些“必须得做”的事,交给 `finally` 最放心。
不过,Apex 里有些异常特别“霸道”,,根本无法捕获,。
哪怕你写了 `try/catch`,也没用,连 `finally` 都不会执行。
你要特别注意这几类:
- 调控器限制导致的异常,比如 `LimitException`,也就是幻灯片上说的 `LimitResponse`;
- 断言失败的某些系统级异常;
- 还有许可证相关的异常,像缺少功能许可时抛出的错误。
遇到这些情况,程序会直接中断,没有挽回的余地。所以在编码时,要尽量避免触碰这些硬限制。
最后,在 API 版本 41.0 及之后,Apex 编译器变得更聪明了。
如果你写了一个无条件的 `throw` 语句,比如 `throw new MyException();`,然后下面还写了别的代码,编译器会直接报错,告诉你那段代码永远不会被执行到。
这其实是在帮我们提前发现逻辑错误,因为我们既然已经扔出了异常,后面的代码本来就没机会运行,删掉或者调整顺序才对。
总结一下:
- 出问题就,扔,异常对象;
- 用 `try/catch/finally` 来接住并处理,,具体异常放前,通用异常放最后,;
- `finally` 永远跑,适合做清理;
- 记住那几类抓不住的异常,别指望 `catch` 能救回来;
- 新版本编译器还会管着你别写“死代码”。
这样一梳理,Apex 的异常处理是不是就清晰多了?我们下节课再见。
关键词
Apex
Salesforce
Developer Guide