细说PHP中的Throwable

Error和Exception

PHP中的异常错误可以分为两大类:Exception(用户级异常)和Error(内部错误),用户级异常可以捕获代码逻辑上的异常,而代码错误、内存溢出这些异常则属于内部错误,在PHP5及以前,内部错误是无法被捕获的,程序会直接中断运行。PHP这个奇怪的设计给日常开发调试带来了极大的不便,我们平时只能靠自己的细心和经验来尽量避免出现这类问题。

PHP7之后的变化

Error的变化

PHP7开始内部错误可以被作为Error异常抛出了,既然能抛出,自然也是可以捕获的,同时也可以通过注册set_exception_handler进行处理,如果没有经过这些处理,则依旧会被报告称一个致命错误Fatal Error

由于PHP7开始Error成为了一个内置类,因此作为预定义的保留字段,我们是不可以在定义类的时候使用的,否则将会报错。

Throwable接口

PHP7新增了一个Throwable接口,ErrorException都实现了这个接口,将两个异常分支同一了,该接口的定义如下(可以看到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来同时捕获ErrorException,直接使用try/catch来实现即可:

try {
    // ...
} catch (\Throwable $t) {
    // Error或者Exception
}

开发者不能直接实现Throwable接口,只能继承Exception,这样设定的目的是确保PHP的异常错误只可以有ExceptionError两大类。可以通过一个继承Throwable接口的自定义接口来创建额外的方法,然后通过一个继承了Exception的类来实现它:

interface UserThrowable extends Throwable {}
class UserException extends Exception implements UserThrowable {}
上一篇
下一篇