乐趣区

关于php:一起搞懂PHP的错误和异常三

对于谬误与异样的最初一篇文章,咱们来进行一些总结。

PHP 中谬误和异样的区别

通过后面两篇文章的学习,咱们来间接将谬误和异样摆上来进行比照,看看他们的区别与分割:

  • 谬误的呈现通常是语法或编译运行时谬误,是咱们要防止的。而异样个别与业务逻辑无关,基本上是人为抛出,须要下层来解决
  • 谬误有告诉、正告类不会中断程序运行,有严重错误会让程序立刻停止运行。停止运行的程序没有别的形式让程序持续运行。异样能够通过 try…catch 捕捉,捕捉后的异样能够持续运行,不捕捉的异样间接导致程序停止运行
  • 谬误的提醒与 php.ini 中的配置无关,线上尽量不要显示谬误。谬误也尽量不要带线上。线上的谬误记录到日志中,开发的谬误显示则尽量关上不便开发人员及时调试。

PHP7 看待谬误的变动

PHP7 中从新定义了一些谬误的解决形式,让大部分谬误能够进行捕捉。而且减少了一个 Throwable 接口,它能够捕捉大部分的谬误和所有的异样。

也就是说,很多谬误能够通过 try…catch 进行捕捉了。而无奈捕捉的基本上是正告类的谬误,这些谬误能够通过 set_exception_handler() 进行注册解决。

Error 类不是继承自 Exception 类,所以想全局捕捉的话最好还是应用 Throwable 来进行捕捉,不论是 Error 还是 Exception 都实现了这个接口。

try {test();
} catch (Throwable $e) {print_r($e);
}

echo '未定义 test()', PHP_EOL;


try {new PDO();
} catch (ArgumentCountError $e) {print_r($e);
}

echo '没给 PDO 参数', PHP_EOL;

function test1() : int{return 'test';}
try {test1();
} catch (TypeError $e) {print_r($e);
}

echo '返回值类型不正确', PHP_EOL;

下面的例子中咱们捕捉了在 PHP5 中被定义为谬误的异样。如果不应用 try…catch 进行捕捉的话,它们在 PHP7 中仍然会被当做谬误来看待。咱们来看看 Throwable 上面都有哪些新减少的谬误异样解决类。

Throwable

  • Error

    • ArithmeticError

      • DivisionByZeroError
    • AssertionError
    • CompileError

      • ParseError
    • TypeError

      • ArgumentCountError
  • Exception

另外咱们还能够通过全局注册来对异样进行全局解决,也就是下面所说的 set_exception_handler() 办法。留神,应用这个全局注册异样解决后,出现异常前面的代码将不执行了。相当于进行了截断,这样的话只能记录一个异样日志。

set_exception_handler(function ($ex) {
    echo 'set_exception_handler:', PHP_EOL;
    print_r($ex);
});
test();
echo 'Not Execute...'; // 不会输入了 

像是除 0 这种谬误,通过测试发现 DivisionByZeroError 类还是无奈捕捉,这样的谬误如果想捕捉,咱们能够应用 set_error_handler() 获取异样后再抛出谬误。

set_error_handler(function ($errno, $errmsg) {if($errmsg == 'Division by zero'){throw new DivisionByZeroError();
    }else{throw new Error($errmsg, $errno + 10000);
    }
});

try{
    100 / 0; // DivisionByZeroError:DivisionByZeroError Object
    // echo $f; // Error: code = 10008
}catch(DivisionByZeroError $e){
    echo 'DivisionByZeroError:'; 
    print_r($e);
}catch(Error $e){
    echo 'Error'; 
    print_r($e);
}

通过 set_error_handler() 抛出异样,咱们就能够捕捉这些正告类型的谬误了,不论是 warning 还是 notice。能够切换正文来查看除 0 谬误和未定义变量谬误别离抛出的异样。不过就像咱们始终强调的那样,这类谬误是能够间接防止的,除前先对除数判断一下就能够间接抛出异样或者返回错误信息了,不要让 PHP 来报错。

总结

通过这三篇文章,能够说咱们基本上可能分明地理解 PHP 中谬误和异样的区别、特点以及他们的应用场景,并且可能针对不同的谬误和异样进行相应的解决了。当然,相干的内容其实还有很多,未来在发现相似的内容时咱们还会通过独自的文章来进行独立的解说。这次咱们就先完结了总体的谬误和异样的学习哈。接下来的学习将持续围绕 PHP 官网文档进行,后续仍然精彩!!

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202002/source/%E4%B8%80%E8%B5%B7%E6%90%9E%E6%87%82PHP%E7%9A%84%E9%94%99%E8%AF%AF%E5%92%8C%E5%BC%82%E5%B8%B8%EF%BC%88%E4%B8%89%EF%BC%89.php

参考文档:
https://www.php.net/manual/zh/language.errors.php7.php
https://www.php.net/manual/zh/function.set-exception-handler.php
https://www.php.net/manual/en/class.error.php

===========

各自媒体平台均可搜寻【硬核项目经理】

退出移动版