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);
Sr.No 参数和说明
1 error_level
必需 - 指定用户定义错误的错误报告级别。必须是一个数值。
2 error_message
必需 - 指定用户定义错误的错误消息
3 error_file
可选 - 指定发生错误的文件名
4 error_line
可选 - 指定发生错误的行号
5 error_context
可选 - 指定包含发生错误时使用的每个变量及其值的数组

可能的错误级别

这些错误报告级别是用户定义的错误处理程序可用于的不同类型的错误。这些值用cab组合使用 | 操作者

Sr.No 常量和说明
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级别外(E_STRICT自PHP 6.0起E_ALL的一部分)
8191

所有上述错误级别都可以使用以下PHP内置库函数进行设置,其中level cab可以是上表中定义的任何值。

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有一个类似于其他编程语言的异常模型。异常很重要,并提供了对错误处理的更好控制。

让我们解释一下与例外相关的新关键字。

  • 尝试 - 使用异常的函数应位于“尝试”块中。 如果异常不触发,代码将继续正常。但是,如果异常触发,则会抛出异常。

  • 抛出 - 这是你触发例外的方式。 每个“扔”必须至少有一个“抓”。

  • Catch - “catch”块检索一个异常并创建一个包含异常信息的对象。

当引发异常时,语句后面的代码将不会被执行,PHP将尝试查找第一个匹配的catch块。如果一个异常没有被捕获,一个PHP致命错误将被发出一个“Uncaught Exception ...”

  • 可以引发异常,并在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() - n的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错误处理函数中检查完整的错误处理函数集