错误处理是捕获程序引发的错误,然后采取适当的措施的过程。 如果能正确处理错误,那么可以处理许多不可预见的后果。
在PHP中处理一个错误是非常简单的。
使用die()函数
在编写PHP程序时,应该在继续之前检查所有可能的错误情况,并在需要时采取适当的措施。
尝试下面的例子,处理如果没有test.xt
文件提示错误信息并终止程序。
<?php
if(!file_exists("test.txt")) {
die("File not found");
}else {
$file = fopen("test.txt","r");
print "Opend file sucessfully";
}
// Test of the code here.
?>
这样就可以编写一个高效的代码。 使用上述技术,您可以在出错时停止程序,并显示更有意义且用户友好的信息。
定义自定义错误处理函数
开发者可以编写自己的函数来处理错误。 PHP提供了一个定义错误处理函数的框架。
此函数必须能够处理至少两个参数(错误级别和错误消息),但最多可以接受五个参数(可选:文件,行号和错误上下文) -
语法
error_function(error_level,error_message,error_file,error_line,error_context);
它的参数说明如下 -
- error_level - 必需项 - 指定用户定义的错误的错误报告级别。 必须是数值。
- error_message - 必需项 - 指定用户定义错误的错误消息。
- error_file - 可选项 - 指定发生错误的文件名。
- error_line - 可选项 - 指定发生错误的行号。
- error_context - 可选项 - 指定包含发生错误时使用的每个变量及其值的数组。
可能的错误级别
这些错误报告级别是用户定义的错误处理程序可用于的不同类型的错误。 这些值用cab
组合使用|
操作符。
编号 | 变量 | 描述 | 代码值 |
---|---|---|---|
1 | E_ERROR |
致命的运行时错误。 脚本的执行被暂停。 | 1 |
2 | E_WARNING |
非致命的运行时错误。 脚本的执行不会停止。 | 2 |
3 | E_PARSE |
编译时解析错误。 解析错误只能由解析器生成。 | 4 |
4 | E_NOTICE |
运行时通知。 该脚本找到了一些可能是错误的东西,但也可能在正常运行脚本时发生。 | 8 |
5 | E_CORE_ERROR |
PHP初次启动时发生的致命错误。 | 16 |
6 | E_CORE_WARNING |
非致命的运行时错误。 这发生在PHP的初始启动过程中。 | 32 |
7 | E_USER_ERROR |
致命的用户生成错误。 这就像程序员使用PHP函数trigger_error() 设置的E_ERROR |
256 |
8 | E_USER_WARNING |
非致命的用户生成的警告。 这就像程序员使用PHP函数trigger_error() 设置的E_WARNING |
512 |
9 | E_USER_NOTICE |
用户生成的通知。 这就像程序员使用PHP函数trigger_error() 设置的E_NOTICE |
1024 |
10 | E_STRICT |
运行时通知。 启用PHP建议更改您的代码,这将确保代码的最佳互操作性和向前兼容性。 | 2048 |
11 | E_RECOVERABLE_ERROR |
可捕捉的致命错误。 这就像E_ERROR ,但可以被用户定义的句柄捕获(另请参阅set_error_handler() ) |
4096 |
12 | E_ALL |
所有错误和警告,除了E_STRICT 级别(从PHP 6.0起,E_STRICT 成为E_ALL 一部分) |
8191 |
所有上述错误级别可以使用以下PHP内置库函数进行设置,其中level
是上表中定义的任何值。
int error_reporting ( [int $level] )
以下是创建一个错误处理函数的方式 -
<?php
function handleError($errno, $errstr,$error_file,$error_line) {
echo "<b>Error:</b> [$errno] $errstr - $error_file:$error_line";
echo "<br />";
echo "Terminating PHP Script";
die();
}
?>
当定义了自定义错误处理程序,需要使用PHP内置函数库set_error_handler()
来设置它。 现在通过调用一个不存在的函数来检查上面的例子。
<?php
error_reporting( E_ERROR );
function handleError($errno, $errstr,$error_file,$error_line) {
echo "<b>出错啦:</b> [$errno] $errstr - $error_file:$error_line";
echo "<br />";
echo "Terminating PHP Script";
die();
}
//set error handler
set_error_handler("handleError");
//trigger error
myFunction();
?>
异常处理
PHP5有一个类似于其他编程语言的异常模型。异常很重要,对错误处理提供了更好的控制。
这里解释一下与异常有关一些关键字。
- try - 用异常的函数应该放在
try
块中。 如果异常不触发,代码将继续正常。 但是,如果异常触发,则抛出异常。 - throw - 这表示如何触发一个异常。每个
throw
必须至少有一个catch
。 - catch -
catch
块检索一个异常并创建一个包含异常信息的对象。
当引发异常时,语句后面的代码将不会被执行,PHP将尝试查找第一个匹配的catch
块。 如果一个异常没有被捕获,那么如果有PHP致命错误,则将会发送一个“Uncaught Exception”
。
- 可以抛出异常,并在PHP中捕获。 代码可以被包围在一个
try
块中。 - 每次
try
都必须至少有一个相应的catch
块。 可以使用多个catch
块来捕捉不同类别的异常。 - 异常可以在
catch
块中抛出(或重新抛出)。
示例
以下是一段代码,将此代码复制并粘贴到文件中,并验证结果。
<?php
try {
$error = 'Always throw this error';
throw new Exception($error);
// Code following an exception is not executed.
echo 'Never executed';
}catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "
";
}
// Continue execution
echo 'Hello World';
?>
在上面的例子中,$e->getMessage()
函数用于获取错误信息。以下是Exception
类的函数。
- getMessage() - 异常的消息。
- getCode() - 异常的代码编号。
- getFile() - 源文件名。
- getLine() - 源文件行数。
- getTrace() - backtrace()的一个数组。
- getTraceAsString() - 格式化的跟踪字符串。
创建自定义异常处理程序
程序员可以定义自己的自定义异常处理程序。 使用以下函数来设置用户定义的异常处理函数。
string set_exception_handler ( callback $exception_handler )
这里的exception_handler
是当一个未捕获的异常发生时被调用的函数的名字。 在调用set_exception_handler()
之前,必须定义这个函数。
示例
<?php
function exception_handler($exception) {
echo "Uncaught exception: " , $exception->getMessage(), "
";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executed
";
?>
在PHP错误处理函数中查看完整的错误处理函数集。