Error和Exception
PHP中的异常错误可以分为两大类:Exception(用户级异常)和Error(内部错误),用户级异常可以捕获代码逻辑上的异常,而代码错误、内存溢出这些异常则属于内部错误,在PHP5及以前,内部错误是无法被捕获的,程序会直接中断运行。PHP这个奇怪的设计给日常开发调试带来了极大的不便,我们平时只能靠自己的细心和经验来尽量避免出现这类问题。
PHP7之后的变化
Error的变化
PHP7开始内部错误可以被作为Error异常抛出了,既然能抛出,自然也是可以捕获的,同时也可以通过注册set_exception_handler进行处理,如果没有经过这些处理,则依旧会被报告称一个致命错误Fatal Error。
由于PHP7开始
Error成为了一个内置类,因此作为预定义的保留字段,我们是不可以在定义类的时候使用的,否则将会报错。
Throwable接口
PHP7新增了一个Throwable接口,Error和Exception都实现了这个接口,将两个异常分支同一了,该接口的定义如下(可以看到Throwable的定义跟Exception几乎完全一样):
interface Throwable {
/* Methods */
public getMessage(): string
public getCode(): int
public getFile(): string
public getLine(): int
public getTrace(): array
public getTraceAsString(): string
public getPrevious(): ?Throwable
public __toString(): string
}
我们可以通过Throwable来同时捕获Error和Exception,直接使用try/catch来实现即可:
try {
// ...
} catch (\Throwable $t) {
// Error或者Exception
}
开发者不能直接实现
Throwable接口,只能继承Exception,这样设定的目的是确保PHP的异常错误只可以有Exception和Error两大类。可以通过一个继承Throwable接口的自定义接口来创建额外的方法,然后通过一个继承了Exception的类来实现它:interface UserThrowable extends Throwable {} class UserException extends Exception implements UserThrowable {}