0x00 简单应用
当执行部分可能抛出异常的代码时,catch 可以捕捉到 try 代码段内抛出的异常(前提是 catch 的参数类型和抛出的异常类型相符),类型不符合的异常会继续向上层抛出。比如以下代码:
直接捕获:
| 1 | function foo() | 
抛出至上层捕获:
| 1 | function foo() | 
可以使用多个连续 catch 捕获不同类型的异常,示例如下:
| 1 | function foo() | 
PHP 7.1 新特性:同一个 catch 可以通过 | 分割异常类型,实现捕获多种异常。示例如下:
| 1 | function foo() | 
0x01 返回值的注意事项
在没有引入 finally 关键字时,在 try...catch 的中返回值是符合直觉的如下例:
| 1 | function foo() | 
但引入 finally 关键字的代码如下:
| 1 | function foo() | 
finally 内的代码是无论是否捕获到异常都会执行的代码,并且当 finally 中存在 return 返回值时,整个try..catch...finally段的返回值只会是 finally 的返回值。
猜测下例代码输出
| 1 | $a = 1; | 
输出结果为 23 这说明了finally 即使在 try 或 catch 中执行了 return 也同样会执行。
0x02 Throwable 接口
Throwable 是 PHP 7 新出的一个预定义接口,Error 和 Exception 类都实现了这个接口,也就是说我们现在有能力通过 catch 捕获到 Error。示例如下:
| 1 | function foo(int $a): int | 
例子表明了参数类型不符所抛出的 TypeError 错误可以被 catch 捕获。
0x03 全局异常处理函数
官方文档 set_exception_handler 设置一个全局的异常处理函数可以捕获所有没有被 catch 到的异常。使用示例:
| 1 | set_exception_handler(function (Exception $e) { | 
类似的对于错误处理有 set_error_handler 函数。


