发生错误后会终止程序执行吗?
$n = 1 / 0;
echo "end";
不会,也就是说,上面的 end 仍然会执行。
显示错误
当 PHP 程序发生错误时,如果错误没有显示出来,可能是禁用了错误显示。解决方法是:PHP 目录下 php.ini,display_errors = Off 改为 display_errors = On,重启 Apache。
die()、exit()
这两个函数是一个意思,他们的作用就是抛出一个错误,然后终止程序的执行,它们可以跟一个参数用来输出到客户端以说明发生了什么错误。
除了发生重大的错误,这两个函数意义不大,因为它只是简单地抛出错误,然后野蛮地终止后面程序的执行。
自定义错误处理程序
function processError($error_level, $error_message, $error_file, $error_line, $error_context)
{
$contents = "错误级别:" . $error_level . "\r\n" .
"错误信息:" . $error_message . "\r\n" .
"错误所在文件:" . $error_file . "\r\n" .
"错误所在行:" . $error_line . "\r\n" .
"错误相关信息:" . $error_context;
file_put_contents("log_" . time() . ".txt", $contents);
}
set_error_handler("processError");
$n = 1 / 0;
上述代码中,当错误发生时,不论 display_errors 是 On 还是 Off,都不会将错误输出到客户端,而是由自定义错误处理程序 processError 来执行,当然错误处理程序和注册错误处理程序的代码应该在最前面。错误处理程序的参数个数可以是 0 - 5 个。
如果错误处理程序中又出错了,会不会造成死循环呢?不会,因为,错误处理程序中的错误还是由系统来处理。
异常处理
在 PHP 中用抛出异常用:
throw new Exception("异常信息");
捕获异常有两种方法:
try
{
throw new Exception("异常信息");
}
catch (Exception $e)
{
echo $e->getMessage();
}
Exception 对象除了 getMessage() 方法,还有其他一些方法 getCode()、getFile()、getLine() 等。
另外一种捕获异常的方法是使用 set_exception_handler 方法,用法同 set_error_handler,只是异常处理程序只有一个 Exception 类型的参数。