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 {}