PHP7中的异常与错误处理
PHP 中的 Exception,Error,Throwable
PHP7 异常处理机制过去的 PHP,处理致命错误几乎是不可能的。致命错误不会调用由 在 PHP7 中,当致命错误和可捕获的错误( 注意:其他级别的错误如 从 Throwable为了统一两个异常分支, PHP7 中新的异常结构如下: 1 interface Throwable 2 |- Exception implements Throwable 3 |- ... 4 |- Error implements Throwable 5 |- TypeError extends Error 6 |- ParseError extends Error 7 |- ArithmeticError extends Error 8 |- DivisionByZeroError extends ArithmeticError 9 |- AssertionError extends Error 如果在 PHP7 的代码中定义了 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 }
这个接口看起来很熟悉。
1 try {
2 // Code that may throw an Exception or Error.
3 } catch (Throwable $t) {
4 // Handle exception
5 }
用户定义的类不能实现
1 interface MyPackageThrowable extends Throwable {}
2
3 class MyPackageException extends Exception implements MyPackageThrowable {}
4
5 throw new MyPackageException();
Error事实上,PHP5.x 中所有的错误都是 1 $var = 1;
2 try {
3 $var->method(); // Throws an Error object in PHP 7.
4 } catch (Error $e) {
5 // Handle error
6 }
通常情况下,之前的致命错误都会抛出一个基本的 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 passed to add() must be of the type integer,string given
ParseError当 1 try {
2 require 'file-with-parse-error.php';
3 } catch (ParseError $e) {
4 echo $e->getMessage(),"n";
5 }
ArithmeticError
1 try {
2 $value = 1 << -1;
3 catch (ArithmeticError $e) {
4 echo $e->getMessage();//Bit shift by negative number
5 }
DevisionByZeroError当 1 try {
2 $value = 1 % 0;
3 } catch (DivisionByZeroError $e) {
4 echo $e->getMessage();//Modulo by zero
5 }
AssertionError当
1 ini_set('assert.exception',1);
2
3 $test = 1;
4
5 assert($test === 0);
6
7 //Fatal error: Uncaught AssertionError: assert($test === 0)
只有断言启用并且是设置 ini 配置的 在你的代码中使用 Error用户可以通过继承
由于 编写代码支持 PHP5.x 和 PHP7 的异常为了在同样的代码中捕获任何 PHP5.x 和 PHP7 的异常,可以使用多个 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.x
5 } catch (Exception $e) {
6 // Executed only in PHP 5.x,will not be reached in PHP 7
7 }
不幸的是,处理异常的函数中的类型声明不容易确定。当 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
