PHP在什么时候应该使用异常处理(Exception)?

一个容易被忽视,却又久经争议的问题。以下个人观点,并非官方解释。

PHP 5 has an exception model similar to that of other programming languages. An exception can be thrown, and caught (“catched”) within PHP. Code may be surrounded in a try block, to facilitate the catching of potential exceptions. Each try must have at least one corresponding catch or finally block.

The thrown object must be an instance of the Exception class or a subclass of Exception. Trying to throw an object that is not will result in a PHP Fatal Error.

首先看一段官方解释(异常处理),如上,其最后一句话说明解释异常与PHP错误的关联解决上。

下面来看异常与PHP错误机制各有什么优缺点?应该如何使用?

根据PHP官方说明PHP的错误机制(错误码)出现于异常之前,用于输入PHP的错误信息,从衍生性来看异常这个概念可以看成是自定义错误机制,用于弥补PHP错误机制(错误码)的不足。

这就说明了一点在信息量方便,异常, 可以包含更丰富的错误信息, 比如错误信息, 错误码, 错误的行数, 文件, 甚至出错上下文, 避免错误信息不丰富的问题

注:图中有一处不严谨, 即在确定是否最后一个catch块的时候, 会同时判断(is_a), 如果是才进入最后一个catch块执行。

性能和方便, 往往是一个矛盾体,根据场景,自己来选择。

最后一个要讨论的是强迫症问题,如果所有错误都用异常,那么你会看到满屏的try{}catch{},错误很多,有自己决定怎么解决。这就是现在很多框架下会有自定义异常的扩展需求(太多可能的Uncaught Exception),我想意思可能是,交给用户自己设计。

使用try{}catch{}不能铺货WARNING错误,需要自己定义捕获错误的函数,例如:

1
2
3
4
5
6
7
8
9
10
11
12
set_error_handler(function () {
throw new Exception('Ach!');
});

try {
$result = 4 / 0;
} catch( Exception $e ){
echo "Divide by zero, I don't fear you!".PHP_EOL;
$result = 0;
}

restore_error_handler();