PHP 错误和异常处理
-
PHP 错误和异常处理
错误处理是捕获程序引发的错误然后采取适当措施的过程。如果你不能妥善处理错误,那么可能会导致许多不可预见的后果。它在PHP中可以非常简单处理错误。 -
使用die()函数
在编写PHP程序时,应该检查所有可能的错误情况,然后再继续并在需要时采取适当的措施。尝试以下示例,文件自定义,尝试一个不存在的文件和一个存在的文件。<?php if(!file_exists("/tmp/test.txt")) { die("文件没找到"); }else { $file = fopen("/tmp/test.txt","r"); print "成功打开文件"; } // 测试代码写这里 fclose($file); ?>
这样您就可以编写有效的代码。使用上述技术,您可以在错误输出时停止程序并显示更有意义且用户友好的消息。 -
自定义错误处理函数
您可以编写自己的函数来处理任何错误。PHP为您提供了一个定义错误处理函数的框架。此函数必须能够处理至少两个参数(错误级别和错误消息),但最多可以接受五个参数(可选:文件,行号和错误上下文)语法:error_function(error_level,error_message, error_file,error_line,error_context);
参数 描述 error_level 必需 - 指定用户定义的错误的错误报告级别。 必须是值编号。 error_message 必需 - 指定用户定义的错误的错误消息 error_file 可选 - 指定发生错误的文件名 error_line 可选 - 指定发生错误的行号 error_context 可选 - 指定包含发生错误时正在使用的每个变量及其值的数组 可能的错误级别错误级别常量 描述 值 E_ERROR 致命的运行时错误。停止执行脚本 1 E_WARNING 非致命的运行时错误。不会停止执行脚本 2 E_PARSE 编译时解析错误。解析错误只应由解析器生成。 4 E_NOTICE 运行时通知。该脚本发现可能是错误的内容,但也可能在正常运行脚本时发生 8 E_CORE_ERROR PHP初始启动期间发生的致命错误 16 E_CORE_WARNING 非致命的运行时错误。这发生在PHP的初始启动期间。 32 E_USER_ERROR 致命的用户生成错误。这就像程序员使用PHP函数trigger_error()设置的E_ERROR 256 E_USER_WARNING 非致命的用户生成警告。这就像程序员使用PHP函数trigger_error()设置的E_WARNING 512 E_USER_NOTICE 用户生成的通知。这就像程序员使用PHP函数trigger_error()设置的E_NOTICE 1024 E_STRICT 运行时通知。允许PHP建议对代码进行更改,以确保代码的最佳互操作性和向前兼容性。 2048 E_RECOVERABLE_ERROR 可捕获的致命错误。这类似于E_ERROR,但可以由用户定义的句柄捕获(另请参见set_error_handler()) 4096 E_ALL 所有错误和警告,除了E_STRICT级别(E_STRICT将是PHP7.0中E_ALL的一部分) 8191 所有上述错误级别都可以使用以下PHP内置库函数进行设置,其中$level是上表中定义的任何值。int error_reporting ([int $level])
以下是您可以创建一个错误处理函数的方法<?php function handleError($errno, $errstr,$error_file,$error_line) { echo "<b>错误:</b> [$errno] $errstr - $error_file:$error_line"; echo "<br />"; echo "终止PHP脚本"; 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 "终止PHP脚本"; die(); } //设置错误句柄 set_error_handler("handleError"); //触发错误,因为下面这个函数调用了一个未定义的函数 myFunction(); ?>
-
异常处理
PHP 5有一个类似于其他编程语言的异常模型。异常处理非常重要,可以更好地控制错误处理。让我们解释一下与异常相关的新关键字。- try - 使用异常的函数应该在“try”块中。如果异常未触发,则代码将继续正常进行。但是,如果异常触发,则会抛出异常。
- throw - 这是触发异常的方式。每个“throw”必须至少有一个“catch”。
- catch - “catch”块检索异常并创建包含异常信息的对象。
抛出异常时,不会执行语句后面的代码,PHP将尝试查找第一个匹配的catch块。如果没有捕获到异常,将发出一个PHP致命错误,其中包含“Uncaught Exception ...- 可以抛出异常,并在PHP中捕获(“catch”)。代码可以在try块中包围。
- 每次try必须至少有一个相应的捕获块。可以使用多个catch块来捕获不同类别的异常。
- 可以在catch块中抛出(或重新抛出)异常。
以下是一段代码,将此代码复制并粘贴到文件中并验证结果。<?php try { $error = '总是抛出这个错误'; throw new Exception($error); // 不执行异常后的代码。 echo '永远不执行'; }catch (Exception $e) { echo '捕获异常: ', $e->getMessage(), "\n"; } // 继续执行 echo 'Hello World'; ?>
在上面的示例中,$e->getMessage函数用于获取错误消息。可以从Exception类中使用以下函数。- getMessage() - 异常消息
- getCode() - 异常代码
- getFile() - 源文件名
- getLine() - 源代码行
- getTrace() - 跟踪的数组
- getTraceAsString() - 格式化的跟踪字符串
创建自定义异常处理程序,您可以定义自己的自定义异常处理程序。使用以下函数设置用户定义的异常处理函数。string set_exception_handler ( callback $exception_handler )
这里,exception_handler是发生未捕获的异常时要调用的函数的名称。必须在调用set_exception_handler()之前定义此函数。<?php function exception_handler($exception) { echo "捕获异常: " , $exception->getMessage(), "\n"; } set_exception_handler('exception_handler'); throw new Exception('未捕获的异常'); echo "不会执行\n"; ?>
提示:在后面的章节会介绍错误处理的完整函数集。