在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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!'; } ?>
附: http://wenku.baidu.com/view/c6c40711cc7931b765ce15b8.html |
2022-07-18
2022-08-16
2022-11-06
2022-08-18
2022-08-15
请发表评论