首页 > 作文

PHP7中的异常与错误处理

更新时间:2023-04-07 21:14:00 阅读: 评论:0

php 中的 exception, error, throwable

php 中将代码自身异常(一般是环境或者语法非法所致)称作错误error,将运行中出现的逻辑错误称为异常exception错误是没法通过代码处理的,而异常则可以通过try/catch来处理php7 中出现了throwable接口,该接口由errorexception实现,用户不能直接实现throwable接口,而只能通过继承exception来实现接口

php7 异常处理机制

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

在 php7 中,当致命错误和可捕获的错误(e_errore_recoverable_error)发生时会抛出异常,而不是直接停止脚本的运行。对于某些情况,比如内存溢出,致命错误则仍然像之前一样直接停止脚本执行。在 php7 中,一个未捕获的异常也会是一个致命错误。这意味着在 php5.x 中致命错误抛出的异常未捕获,在 php7 中也是致命错误。

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

fatalrecoverable级别错误抛出的异常并非继承自exception类。这种分离是为了防止现有 php5.x 的用于停止脚本运行的代码也捕获到错误抛出的异常。fatalrecoverable级别的错误抛出的异常是一个全新分离出来的类error类的实例。跟其他异常一样,errorpolicies类异常也能被捕获和处理,同样允许在finally之类的块结构中运行。

throwable

为了统一两个异常分支,exceptionerror都实现了一个全新的接口:throwable

php7 中新的异常结构如下:

1 interface throwable2     |- exception implements throwable3         |- ...4     |- error implements throwable5         |- typeerror extends error6         |- parerror extends error7         |- arithmeticerror extends error8             |- divisionbyzeroerror extends arithmeticerror9         |- asrtionerror extends error

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

 1 interface throwable{ 2     public function getmessage(): string; 3     public function getcode(): int; 4     public function getfile(): string; 5     public function getline(): int; 6     public function gettrace(): array; 7     public function gettraceasstring(): string; 8     public function getprevious(): throwable; 9     public function __tostring(): string;10 }

这个接口看起来很熟悉。throwable规定的方法跟exception几乎是一样的。唯一不同的是throwable::getprevious()返回的是throwable的实例而不是exception的。exceptionerror的构造函数跟之前exception一样,可以接受任何throwable的实例。

throwable可以用于try/catch块中捕获exceptionerror对象(或是任何未来可能的异常类型)。记住捕获更多特定类型的异常并且对之做相应的处理是更好的实践。然而在某种情况下我们想捕获任何类型的异常(比如日志或框架中错误处理)。在 php7 中,要捕获所有的应该使用throwable而不是exception

1 try {2 // code that may throw an exception or error.3 } catch (throwable $t) {4 // handle exception5 }

用户定义的类不能实现throwable接口。做出这个决定一定程度上是为了预测性和一致性——只有exceptionerror的对象可以被抛出。此外,异常需要携带对象在追溯堆栈中创建位置的信息,而用户定义的对象不会自动的有参数来存储这些信息。

throwable可以被继承从而创建特定的包接口或者添加额外的方法。一个继承自throwable的接口只能被exceptionerror的子类来实现。

1 interface mypackagethrowable extends throwable {}2 3 class mypackageexception extends exception implements mypackagethrowable {}4 5 throw new mypackageexception();

error

事实上,php5.x 中所有的错误都是fatalrecoverable级别的错误,在 php7 中都能抛出一个error实例。跟其他任何异常一样,error对象可以使用try/catch块来捕获。

1 $var = 1;2 try {3 $var->method(); // throws an error object in php 7.4 } catch (error $e) {5 // handle error6 }

通常情况下,之前的致命错误都会抛出一个基本的error类实例,但某些错误会抛出一个更具体的error子类:typeerrorparerror以及asrtionerror

typeerror

当函数参数或返回值不符合声明的类型时,typeerror的实例会被抛出。

 1 function add(int $left, int $right){ 2 return $left + $right; 3 } 4  5 try { 6 $value = add('left', 'right'); 7 } catch (typeerror $e) { 8 echo $e->getmessage(), "\n"; 9 }10 11 //argument 1 pasd to add() m北京大学历任校长ust be of the type integer, string given

parerror

include/require文件或eval()代码存在语法错误时,parerror会被抛出。

1 try {2 require 'file-with-par-error.php';3 } catch (parerror $e) {4 echo $e->getmessage(), "\n";5 }

arithmeticerror

arithmeticerror在两种情况下会被抛出。一是位移操作负数位。二是调用intdiv()时分子是php_int_min且分母是 -1 (这个使用除法运算符的表达式:php_int_min / -1,结果是浮点型)。

1 try {2 $value = 1 << -1;3 catch (arithmeticerror $e) {4 echo $e->getmessage();//bit shift by negative number5 }

devisionbyzeroerror

intdiv()的分母是 0 或者取模操作 (%) 中分母是 0 时,divisionbyzeroerror会被抛出。注意在除法运算符 (/) 中使用 0 作除数(也即xxx/0这样写)时只会触发一个 warning,这时候若分子非零结果是 inf,若分子是 0 结果是 nan。

1 try {2 $value = 1 % 0;3 } catch (divisionbyzeroerror $e) {4 echo $e->getmessage();//modulo by zero5 }

爆脾气asrtionerror

asrt()的条件不满足时,asrtionerror会被抛出。

ini_t('zend.asrtions', 1);
1 ini_t('asrt.exception', 1);2 3 $test = 1;4 5 asrt($test === 0);6 7 //fatal error: uncaught asrtionerror: asrt($test === 0)

只有断言启用并且是设置 ini 配置的zend.asrtions = 1asrt.exception = 1时,asrt()才会执行并抛asrtionerror

在你的代码中使用 error

用户可以通过继承error来创建符合自己层级要求的error类。这就形成了一个问题:什么情况下应该抛出exception,什么情况下应该抛出error

error应该用来表示需要程序员关注的代码问题。从 php 引擎抛出的error对象属于这些分类,通常都是代码级别的错误,比如传递了错误类型的参数给一个函数或者解析一个文件发生错误。exception则应该用于在运行时能安全的处理,并且另一个动作能继续执行的情况。

由于error对象不应该在运行时被处理,因此捕获error对象也应该是不频繁的。一般来说,error对象仅被捕获用于日志记录、执行必要的清理以及展示错误信息给用户。

编写代码支持 php5.x 和 php7 的异常

为了在同样的代码中捕获任何 php5.x 和 php7 的异常,可以使用多个catch,先捕获throwable,然后是exception。当 php5.x 不再需要支持时,捕获exceptioncatch块可以移除。

1 try {2 // code that may throw an exception or error.3 } catch (throwable $t) {4 // executed only in php 7, will not match in php 5.x5 } catch (exception $e) {6 // executed only in p11月17日是什么星座hp 5.x, will not be reached in php 77 }

不幸的是,处理异常的函数中的类型声明不容易确定。当exception用于函数参数类型声明时,如果函数调用时候能用error的实例,这个类型声明就要去掉。当 php5.x 不需要被支持时,类型声明则可以还原为throwable

本文发布于:2023-04-07 21:13:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/eb60431827b8cf69fb099f0a80116e7b.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP7中的异常与错误处理.doc

本文 PDF 下载地址:PHP7中的异常与错误处理.pdf

标签:抛出   异常   错误   代码
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图