PHP 错误和异常处理
错误处理是捕获程序引发的错误并采取适当措施的过程。如果正确处理错误,可能会导致许多不可预见的后果。
在PHP中处理错误非常简单。
使用die()函数
在编写PHP程序时,应在进行下一步操作之前检查所有可能的错误条件,并在需要时采取适当的措施。
尝试以下示例,没有 /tmp/test.xt 文件和有此文件的情况。
<?php
if(!file_exists("/tmp/test.txt")) {
die("File not found");
}else {
$file = fopen("/tmp/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);
序号 | 参数和描述 |
---|---|
1 | error_level 必填 – 指定用户自定义错误的错误报告级别。必须是一个数值。 |
2 | error_message 必填 – 指定用户自定义错误的错误消息 |
3 | error_file 可选 – 指定发生错误的文件名 |
4 | error_line 可选 – 指定发生错误的行号 |
5 | error_context 可选 – 指定一个包含发生错误时使用的每个变量及其值的数组 |
可能的错误级别
这些错误报告级别是用户定义的错误处理程序可用于不同类型的错误。这些值可以使用 | 运算符进行组合。
序号 | 常量和描述 | 值 |
---|---|---|
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内置库函数来设置,其中级别可以是上述表格中定义的任何值。
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>Error:</b> [errno]errstr - error_file:error_line";
echo "<br />";
echo "Terminating PHP Script";
die();
}
//set error handler
set_error_handler("handleError");
//trigger error
myFunction();
?>
异常处理
PHP 5具有与其他编程语言相似的异常模型。异常很重要,可以更好地控制错误处理。
让我们解释一下与异常相关的新关键字。
- Try - 使用异常的函数应该在“try”块中。如果异常不触发,则代码将正常运行。但是,如果异常触发,将抛出一个异常。
-
Throw - 这是触发异常的方式。每个“throw”至少必须有一个“catch”。
-
Catch - “catch”块检索异常并创建一个包含异常信息的对象。
当抛出异常时,语句后面的代码将不会执行,PHP将尝试查找第一个匹配的catch块。如果没有捕获异常,将发出一个PHP致命错误,显示“未捕获异常…”。
- 在PHP中,可以抛出异常并在其中捕获。
-
每个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(), "\n";
}
// 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(), "\n";
}
set_exception_handler('exception_handler');
throw new Exception('Uncaught Exception');
echo "Not Executed\n";
?>
查看完整的错误处理函数集合,请浏览PHP错误处理函数。