1. PHP捕捉异常
try...catch...
<?php function divide($x) { if(!$x) { throw new Exception('Division by zero!'); } else return 1/$x; } try { echo divide(5); echo divide(0); } catch(Exception $e) { echo $e->getMessage(); } ?>
参考: php try catch的使用 http://blog.sina.com.cn/s/blog_610997850100utea.html
重点:
异常触发时, 后续的代码不会再被执行, php会去执行匹配的catch代码块;
异常触发, 但是没有捕获(即没有catch), 且没有使用set_exception_handler, 将发生一个致命错误.
set_exception_handler()函数可以参考: http://cn.php.net/set_exception_handler
2. PHP捕获错误
set_error_handler
<?php function runtimeErrorHandler($level,$string) { //自定义错误处理时,手动抛出一个异常实例 throw new Exception($level.'|'.$string); } //设置自定义错误处理函数 set_error_handler( "runtimeErrorHandler"); try { $a=2/0; //这里制造一个以前无法截获的除0错误 } catch(Exception $e) { echo 'error information:', $e->getMessage(); //显示错误,这里就可以看到错误级别和错误信息了“2|Division by zero” } ?>
使用set_error_handler()函数时, 会绕过php标准的处理函数.
参考: http://www.w3school.com.cn/php/func_error_set_error_handler.asp
http://hi.baidu.com/longlong8304/blog/item/bf247f0ea02edb366159f339.html
奇怪的是, set_time_limit()的错误不能被捕捉到, 这是为什么呢? 求教...
<?php function runtimeErrorHandler($level,$string) { //自定义错误处理时,手动抛出一个异常实例 throw new Exception($level.'|'.$string); } //设置自定义错误处理函数 set_error_handler( "runtimeErrorHandler"); try { set_time_limit ( 1 ); for($i = 0; $i < 500000; $i ++) { echo $i . " line: \n"; } } catch(Exception $e) { echo 'error information:', $e->getMessage(); //显示错误,这里就可以看到错误级别和错误信息了“2|Division by zero” } ?>
3. PHP捕获致命错误的方法
register_shutdown_function
<?php function shutdown() { echo 'Script executed with success', PHP_EOL; } register_shutdown_function('shutdown'); ?>
当然,任何的程序中断都会触发用此方法注册的函数,包括exit()等等。如果想只用来处理某段程序的致命错误,这时需要进行一下判断,可以参考一下代码:
<?php class Test { private $running; public function __construct() { register_shutdown_function(array($this, 'shutdown_handler')); } public function main() { $this->running = true; //开始监测 echo "Hello "; $this->error(); //(undefined method)触发一个致命错误 echo "World "; $this->running = false; //结束监测 } public function shutdown_handler() { if ($this->running) { echo '抱歉出错了~'; @header("Location: error.php"); } } } $t = new Test(); $t->main(); ?>
参考: http://blog.sweetfree.net/article/default/544.html
set_time_limit()超时错误捕获
<?php $es = ini_get('error_reporting'); error_reporting(0); register_shutdown_function('runError'); set_time_limit ( 1 ); for($i = 0; $i < 500000; $i ++) { echo $i . " line: \n"; } error_reporting($es); // 关键步骤 function runError () { echo 'niubility, i just catch the set_time_limit fatal error!'; } ?>
附: