PHP中的异常机制是不足的,绝大多数的情况 下无法自动抛出异常。
一.区分异常和错误
PHP中什么是异常:
程序在运行中出现不符合预期的情况,允许发生(你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。
PHP中什么是错误:
属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。
例子:
<?php $num = 0; echo 1/$num; try { echo 1/$num; } catch (Exception $e){ echo $e->getMessage(); } ?> |
结果:
事实证明,错误不能被try-catch捕获。错识是异常的前提。
二、自定义获取异常和错误
1:set_error_handler()
<?php set_error_handler('zyferror'); $num = 0; echo 1/$num; try { } catch (Exception $e){ echo $e->getMessage(); } function zyferror($type, $message, $file, $line) { echo('<b>set_error_handler: ' . $type . ':' . $message . ' in ' . $file . ' on ' . $line . ' line .</b><br />'); } ?> |
结果:
2:register_shutdown_function()
使用:无法报编译的错误
<?php register_shutdown_function('zyfshutdownfunc'); function zyfshutdownfunc() { if ($error = error_get_last()) { echo('<b>register_shutdown_function: Type:' . $error['type'] . ' Msg: ' . $error['message'] . ' in ' . $error['file'] . ' on line ' . $error['line'] . '</b>'); } } $num = 0; #echo 1++++; echo 1/$num; try { } catch (Exception $e){ echo $e->getMessage(); } ?> |
结果:
echo 1+++;此是由系统抛出的,该函数无法抓到编译报错。
3:set_exception_handler()
设置默认的异常处理程序,用在没有用try/catch块来捕获的异常,也就是说不管你抛出的异常有没有人捕获,如果没有人捕获就会进入到该方法中,并且在回调函数调用后异常会中止。