5. prase error: 语法解析错误,上面几种都属于运行时错误,此错误在运行前就会抛出。
在php中,总共有16错误级别,但是主要的就是上面几种。
error.php
$data = '2012-12-20';
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $data, $regs)) {
echo "$reg[3].$regs[2].$regs[1]";
} else {
echo "Invalid data format: $data";
}
$a = array('o' => 2, 4, 6, 8);
echo $a[o];
$result = array_sum($a, 3);
echo func();
echo '致命错误后,还会执行吗?';
//echo '最高级别错误', $55;
上面代码执行后,会有四个错误级别,如果你无法完全看到的话,你需要去修改你的ini配置文件中错误显示级别为 E_ALL
四、自定义错误处理程序
可以使用 set_error_handler() 函数来托管错误处理程序,可自行定制错误的处理流程。
如果要取消托管的话,可以在同一个页面中使用restore_error_handler()来取消托管。
如果想要自己抛出一个错误的话,可以使用trigger_error()函数。
<?php
//自定义错误处理程序
function customError($errno, $errstr, $errfile, $errline)
{
echo "<b>错误代码:</b>[{$errno}] {$errstr}", PHP_EOL;
echo "错误所在代码行:{$errline} 文件{$errfile}", PHP_EOL;
echo "PHP版本", PHP_VERSION, "(", PHP_OS, ")", PHP_EOL;
}
set_error_handler("customError", E_ALL | E_STRICT);
$a = array('o' => 2, 4, 6, 8);
echo $a[o];
执行上面的代码,可以看到错误信息是由我们自定义的处理程序输出的,完全绕开了系统的处理程序。
如果错误发生在自定义处理程序前,则不会调用我们自定义的错误处理程序,所以应当先定义错误处理程序。
当然不是所有的错误级别都可以用set_error_handler来托管,如EERROR、EPARSE、ECODEWARNING、ECOMPILEERROR、ECOMPILEWARNING以及E_STRICT中的部分。这些错误信息会以原始的方式来显示或者不现实。
PHP把许多异常看作是错误,所以这些"异常"同样可以使用set_error_handler来接管:
function customError($errno, $errstr, $errfile, $errline)
{
//自定义错误处理是,手动抛出异常
throw new Exception($errstr);
}
set_error_handler('customError', E_ALL | E_STRICT);
try {
$a = 5/0;
} catch (Exception $e) {
echo '错误信息:', $e->getMessage();
}
当然这种处理方式也有自己的优缺点:
缺点: 必须依靠程序员自己来掌控对异常的处理,对于异常的高发区、敏感区,如果程序员处理不好,就会导致业务数据不一致的问题。
优点: 可以获得程序运行时的上下文信息,以进行针对性的补救。
fetal error这样的错误无法捕获,也无法在发生后恢复流程处理,但是可以使用







