php捕捉错误的方法:1、使用“try{}catch()”方法捕捉错误;2、通过“set_error_handler”函数捕捉“e_notice”等;3、利用“set_exception_handler”设置默认的异常处理程序。
php错误及异常捕捉
在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的。
所以引用以下几中函数。
a) set_error_handler
一般用于捕捉 e_notice 、e_user_error、e_user_warning、e_user_notice
不能捕捉:
e_error, e_parse, e_core_error, e_core_warning, e_compile_error and e_compile_warning。
一般与trigger_error(..., e_user_error),配合使用。
<?php// we will do our own error handlingerror_reporting(0);function usererrorhandler($errno, $errmsg, $filename, $linenum, $vars){ // timestamp for the error entry $dt = date("y-m-d h:i:s (t)"); // define an assoc array of error string // in reality the only entries we should // consider are e_warning, e_notice, e_user_error, // e_user_warning and e_user_notice $errortype = array ( e_error => 'error', e_warning => 'warning', e_parse => 'parsing error', e_notice => 'notice', e_core_error => 'core error', e_core_warning => 'core warning', e_compile_error => 'compile error', e_compile_warning => 'compile warning', e_user_error => 'user error', e_user_warning => 'user warning', e_user_notice => 'user notice', e_strict => 'runtime notice', e_recoverable_error => 'catchable fatal error' ); // set of errors for which a var trace will be saved $user_errors = array(e_user_error, e_user_warning, e_user_notice); $err = "<errorentry>\n"; $err .= "\t<datetime>" . $dt . "</datetime>\n"; $err .= "\t<errornum>" . $errno . "</errornum>\n"; $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n"; $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n"; $err .= "\t<scriptname>" . $filename . "</scriptname>\n"; $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n"; if (in_array($errno, $user_errors)) { $err .= "\t<vartrace>" . wddx_serialize_value($vars, "variables") . "</vartrace>\n"; } $err .= "</errorentry>\n\n";echo $err;}function distance($vect1, $vect2) { if (!is_array($vect1) || !is_array($vect2)) { trigger_error("incorrect parameters, arrays expected", e_user_error); return null; } if (count($vect1) != count($vect2)) { trigger_error("vectors need to be of the same size", e_user_error); return null; } for ($i=0; $i<count($vect1); $i++) { $c1 = $vect1[$i]; $c2 = $vect2[$i]; $d = 0.0; if (!is_numeric($c1)) { trigger_error("coordinate $i in vector 1 is not a number, using zero",e_user_warning); $c1 = 0.0; } if (!is_numeric($c2)) { trigger_error("coordinate $i in vector 2 is not a number, using zero",e_user_warning); $c2 = 0.0; }$d += $c2*$c2 - $c1*$c1; } return sqrt($d);} $old_error_handle = set_error_handler("usererrorhandler");$t = i_am_not_defined;//generates a warning // define some "vectors"$a = array(2, 3, "foo");$b = array(5.5, 4.3, -1.6);$c = array(1, -3); //generate a user error$t1 = distance($c,$b); // generate another user error$t2 = distance($b, "i am not an array") . "\n"; // generate a warning$t3 = distance($a, $b) . "\n";?>
b) set_exception_handler
设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止。
与throw new exception('uncaught exception occurred'),连用。
<?php// we will do our own error handlingerror_reporting(0);function excepthandle($errno, $errmsg, $filename, $linenum, $vars){ // timestamp for the error entry $dt = date("y-m-d h:i:s (t)"); // define an assoc array of error string // in reality the only entries we should // consider are e_warning, e_notice, e_user_error, // e_user_warning and e_user_notice $errortype = array ( e_error => 'error', e_warning => 'warning', e_parse => 'parsing error', e_notice => 'notice', e_core_error => 'core error', e_core_warning => 'core warning', e_compile_error => 'compile error', e_compile_warning => 'compile warning', e_user_error => 'user error', e_user_warning => 'user warning', e_user_notice => 'user notice', e_strict => 'runtime notice', e_recoverable_error => 'catchable fatal error' ); // set of errors for which a var trace will be saved $err = "<errorentry>\n"; $err .= "\t<datetime>" . $dt . "</datetime>\n"; $err .= "\t<errornum>" . $errno . "</errornum>\n"; $err .= "\t<errortype>" . $errortype[$errno] . "</errortype>\n"; $err .= "\t<errormsg>" . $errmsg . "</errormsg>\n"; $err .= "\t<scriptname>" . $filename . "</scriptname>\n"; $err .= "\t<scriptlinenum>" . $linenum . "</scriptlinenum>\n"; if (1) { $err .= "\t<vartrace>" . wddx_serialize_value($vars, "variables") . "</vartrace>\n"; } $err .= "</errorentry>\n\n";echo $err;}$old_except_handle = set_exception_handler("excepthandle");//$t = i_am_not_defined;//generates a warning$a;throw new exception('uncaught exception occurred'); ?>
c) register_shutdown_function
执行机制是:php把要调用的函数调入内存。当页面所有php语句都执行完成时,再调用此函数。
一般与trigger_error("...", e_user_error),配合使用。
<?phperror_reporting(0);date_default_timezone_set('asia/shanghai');register_shutdown_function('my_exception_handler'); $t = i_am_not_defined;//generates a warningtrigger_error("vectors need to be of the same size", e_user_error); function my_exception_handler(){ if($e = error_get_last()) { //$e['type']对应php_error常量 $message = ''; $message .= "出错信息:\t".$e['message']."\n\n"; $message .= "出错文件:\t".$e['file']."\n\n"; $message .= "出错行数:\t".$e['line']."\n\n"; $message .= "\t\t请工程师检查出现程序".$e['file']."出现错误的原因\n"; $message .= "\t\t希望能您早点解决故障出现的原因<br/>";echo $message; //sendemail to }}?>
c) restore_error_handler()函数
定义和用法 restore_error_handler() 函数恢复之前的错误处理程序,该程序是由 set_error_handler() 函数改变的。
该函数永远返回 true。
是 set_error_handler()的反函数。
更多相关知识,请访问!
以上就是关于php捕捉错误的详解的详细内容。