前沿
说到 错误/异常 ,我们首先肯定想到的是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个函数,基本就可以捕获所有的异常于错误信息了,下面来看看吧
<?php//用于捕获错误,设置一个用户自定义的错误处理函数//注意以下两点://第一,如果存在该方法,相应的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级别的错误。set_error_handler('myError');//捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用//通过这个函数就可以在脚本结束前判断这次执行是否有错误产生,这时就要借助于一个函数:error_get_last();这个函数可以拿到本次执行产生的所有错误。//error_get_last();返回的信息:// [type] - 错误类型// [message] - 错误消息// [file] - 发生错误所在的文件// [line] - 发生错误所在的行register_shutdown_function('myShutdown');//设置默认的异常处理程序,用在没有用try/catch块来捕获的异常,也就是说不管你抛出的异常有没有人捕获,如果没有人捕获就会进入到该方法中,并且在回调函数调用后异常会中止set_exception_handler('myException');function myError($type, $message, $file, $line){$errorInfo = ['type' => $type,'message' => $message,'file' => $file,'line' => $line,];echo 'myError';echo '<pre>';print_r($errorInfo);echo '</pre>';}function myShutdown(){$errorInfo = error_get_last();if ($errorInfo){echo 'myShutdown';echo '<pre>';print_r($errorInfo);echo '</pre>';}}function myException($exception){$errorInfo = ['code' => $exception->getCode(),'message' => $exception->getMessage(),'file' => $exception->getFile(),'line' => $exception->getLine(),'previous' => $exception->getPrevious(),'trace' => $exception->getTrace(),'traceAsString' => $exception->getTraceAsString(),];echo 'myException';echo '<pre>';print_r($errorInfo);echo '</pre>';}//故意写一个错误echo $a;
最后
通过上面的3个系统函数,我们基本上可以自动的捕捉到所有的错误了,是不是很好用呢,自己试试看吧
