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";
    ?>
    提示:在后面的章节会介绍错误处理的完整函数集。