PHP7的异常与错误处理机制

回顾PHP5,Error与Exception相互独立,对于致命错误而言,并不能通过set_error_handler()来捕获,这样致命错误就会直接打印出来,即使通过设置错误级别显示http级的友好错误,这样对用户也并不友好。

例如在使用PHP5开发接口时,并不希望在遇到致命错误时直接中断接口响应,或将程序内部错误展示给用户,通常的做法只能在PHP接口的上一层做处理,想要在PHP全局捕获这些致命错误,需要框架层面的巧妙设计。

PHP的开发团队意识到了这个问题,并在PHP7中解决了这个问题,PHP7添加了Throwable接口,并为Error和Exception划分了全新的层级。

Throwable接口定义

Throwable {
/* Methods */
abstract public getMessage(): string             // 获取消息
abstract public getCode(): int                  // 获取异常code
abstract public getFile(): string               // 获取产生异常的文件
abstract public getLine(): int                  // 获取异常产生的行
abstract public getTrace(): array               // 获取异常追中数组
abstract public getTraceAsString(): string       // 异常追踪数组转string
abstract public getPrevious(): Throwable|null    // 上一条异常
abstract public __toString(): string
}

Throwable层级
Throwable
--Error
----ArithmeticError
----DivisionByZeroError
----AssertionError
----CompileError
----ParseError
----TypeError
----ArgumentCountError
--Exception
----...

在统合前,非致命错误通过调整错误级别来关闭打印,也并不会中断程序执行,致命错误不管是否设置为限制,都会中断程序执行。统合后,Error集成自了Throwable,而我们观察Throwable,他几乎可以之前的Exception一致,这意味着我们可以通过try catch模块来捕获Error

try {
} catch (Error $e) {
   // do something
}

但如果不是捕获特定的指定错误,一般使用Throwable进行捕获

try {
} catch (Error $e) {
   // do something
}

也可以使用set_error_handler()来进行全局捕获,PHP7还提供了set_exception_handler用户全局异常捕获。

可以将这些新特性试着用于如下场景:

接口项目的异常捕获, 在全局分开捕获异常和错误, 所有自定义的异常都抛出自定义的错误消息, 所有非自定义的异常以及致命错误,都抛出自定义的友好错误提示,例如“网络异常,请重试"

发表回复

您的电子邮箱地址不会被公开。