前沿

说到 错误/异常 ,我们首先肯定想到的是try/catch,但是每个方法/函数都写一个 try/catch,未免太麻烦了,遇到想到有没有自动捕捉 错误/异常 的方式,后来在网上搜索了一番,结果还真找打了。

首先需要了解PHP自带的三个函数

set_error_handler()

用于捕获错误,设置一个用户自定义的错误处理函数
注意以下两点:

  • 第一,如果存在该方法,相应的error_reporting()就不能在使用了。所有的错误都会交给自定义的函数处理。
  • 第二,此方法不能处理以下级别的错误:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING

set_error_handler()函数所在文件中产生的E_STRICT,该函数只能捕获系统产生的一些Warning、Notice级别的错误。

register_shutdown_function()

捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用
通过这个函数就可以在脚本结束前判断这次执行是否有错误产生,这时就要借助于一个函数:error_get_last();这个函数可以拿到本次执行产生的所有错误。
error_get_last();返回的信息:
[type] - 错误类型
[message] - 错误消息
[file] - 发生错误所在的文件
[line] - 发生错误所在的行

set_exception_handler()

设置默认的异常处理程序,用在没有用try/catch块来捕获的异常,也就是说不管你抛出的异常有没有人捕获,如果没有人捕获就会进入到该方法中,并且在回调函数调用后异常会中止

列子

通过上面的了解,我们使用上面3个函数,基本就可以捕获所有的异常于错误信息了,下面来看看吧

  1. <?php
  2. //用于捕获错误,设置一个用户自定义的错误处理函数
  3. //注意以下两点:
  4. //第一,如果存在该方法,相应的error_reporting()就不能在使用了。所有的错误都会交给自定义的函数处理。
  5. //第二,此方法不能处理以下级别的错误:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING
  6. //set_error_handler()函数所在文件中产生的E_STRICT,该函数只能捕获系统产生的一些Warning、Notice级别的错误。
  7. set_error_handler('myError');
  8. //捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用
  9. //通过这个函数就可以在脚本结束前判断这次执行是否有错误产生,这时就要借助于一个函数:error_get_last();这个函数可以拿到本次执行产生的所有错误。
  10. //error_get_last();返回的信息:
  11. //  [type] - 错误类型
  12. //  [message] - 错误消息
  13. //  [file] - 发生错误所在的文件
  14. //  [line] - 发生错误所在的行
  15. register_shutdown_function('myShutdown');
  16. //设置默认的异常处理程序,用在没有用try/catch块来捕获的异常,也就是说不管你抛出的异常有没有人捕获,如果没有人捕获就会进入到该方法中,并且在回调函数调用后异常会中止
  17. set_exception_handler('myException');
  18. function myError($type, $message, $file, $line){
  19. $errorInfo = [
  20. 'type' => $type,
  21. 'message' => $message,
  22. 'file' => $file,
  23. 'line' => $line,
  24. ];
  25. echo 'myError';
  26. echo '<pre>';
  27. print_r($errorInfo);
  28. echo '</pre>';
  29. }
  30. function myShutdown(){
  31. $errorInfo = error_get_last();
  32. if ($errorInfo){
  33. echo 'myShutdown';
  34. echo '<pre>';
  35. print_r($errorInfo);
  36. echo '</pre>';
  37. }
  38. }
  39. function myException($exception){
  40. $errorInfo = [
  41. 'code' => $exception->getCode(),
  42. 'message' => $exception->getMessage(),
  43. 'file' => $exception->getFile(),
  44. 'line' => $exception->getLine(),
  45. 'previous' => $exception->getPrevious(),
  46. 'trace' => $exception->getTrace(),
  47. 'traceAsString' => $exception->getTraceAsString(),
  48. ];
  49. echo 'myException';
  50. echo '<pre>';
  51. print_r($errorInfo);
  52. echo '</pre>';
  53. }
  54. //故意写一个错误
  55. echo $a;

运行一下,会显示以下信息
a.png

最后

通过上面的3个系统函数,我们基本上可以自动的捕捉到所有的错误了,是不是很好用呢,自己试试看吧