php7捕捉异常 代码,探索PHP7之九:更方便的错误捕捉机制

探索PHP7之九:更方便的错误捕捉机制

6cd5e4fd49658da7be73f2e8e3760c00.png

2年前

阅读 3454

评论 0

喜欢 0

### 0、全新的PHP错误异常机制

过去的 PHP,处理一些致命错误几乎是不可能的。致命错误不会调用由 `set_error_handler()` 设置的处理方式,而是简单的停止脚本的运行和执行。

在 PHP7 中,当致命错误和可捕获的错误( `E_ERROR` 和 `E_RECOVERABLE_ERROR` )发生时会抛出异常,而不是直接停止脚本的运行。

对于某些情况,比如内存溢出,致命错误则仍然像之前一样直接停止脚本执行。

在 PHP7 中, 一个未捕获的异常也会是一个致命错误 。

这意味着在 PHP5.x 中致命错误抛出的异常未捕获,在 PHP7 中也是致命错误。

注意:其他级别的错误如 `warning` 和 `notice` ,和之前一样不会抛出异常,只有 `fatal` 和 `recoverable` 级别的错误会抛出异常。

从 `fatal` 和 `recoverable` 级别错误抛出的异常并非继承自 `Exception` 类。

这种分离是为了防止现有 PHP5.x 的用于停止脚本运行的代码也捕获到错误抛出的异常。

`fatal` 和 `recoverable` 级别的错误抛出的异常是一个全新分离出来的类 `Error` 类的实例。

跟其他异常一样, `Error` 类异常也能被捕获和处理,同样允许在 `finally` 之类的块结构中运行。

为了统一两个异常分支, `Exception` 和 `Error` 都实现了一个全新的接口: `Throwable`类。

### 1、Throwable类详解。

如果在 PHP7 的代码中定义了 `Throwable` 类,它将会是如下这样:

```php

interface Throwable {

public function getMessage():string;

public function getCode():int;

public function getFile():string;

public function getLine():int;

public function getTrace():array;

public function getTraceAsString():string;

public function getPrevious():Throwable;

public function __toString():string;

}

```

这个接口的内部结构看起来是还不是很熟悉。

`Throwable` 规定的方法跟 `Exception` 几乎是一样的。

唯一不同的是 `Throwable::getPrevious()` 返回的是 `Throwable` 的实例而不是 `Exception` 的。

`Exception` 和 `Error` 的构造函数跟之前 `Exception` 一样,可以接受任何 `Throwable` 的实例。

`Throwable` 可以用于 `try/catch` 块中捕获 `Exception` 和 `Error` 对象(或是任何未来可能的异常类型)。

记住捕获更多特定类型的异常并且对之做相应的处理是更好的实践。

然而在某种情况下我们想捕获任何类型的异常(比如日志或框架中错误处理)。

在 PHP7 中,要捕获所有的应该使用 `Throwable` 而不是 `Exception`,例如:

```

try {

// 可能引发异常或错误的代码

} catch (Throwable $e) {

// 监听并抛出错误异常

}

```

具体使用例子如下:

```

class MathOperations {

protected $n = 10;

// 尝试用零错误对象获得除法并显示为异常

public function doOperation(): string {

try {

$value = $this->n % 0;

return $value;

} catch (Throwable $e) {

return $e->getMessage();

}

}

}

$mathOperationsObj = new MathOperations();

var_dump($mathOperationsObj->doOperation());

```

注意:`Throwable` 也是可以被继承从而创建特定的包接口或者添加额外的方法。

一个继承自 `Throwable` 的接口只能被 `Exception` 或 `Error` 的子类来实现。

更具体的继承用法,可以参考官网文档。

© 著作权归作者所有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值