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

错误级别

必需 - 指定用户定义错误的错误报告级别。必须是一个数值。

2

错误信息

必需 - 指定用户定义错误的错误消息

3

错误文件

可选 - 指定发生错误的文件名

4

错误行

可选 - 指定发生错误的行号

5

错误上下文

可选 - 指定一个数组,其中包含发生错误时使用的每个变量及其值

可能的错误级别

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

先生编号 常数及说明 价值
1

.E_错误

致命的运行时错误。脚本的执行被停止

1
2

E_警告

非致命运行时错误。脚本的执行不会停止

2
3

E_解析

编译时解析错误。解析错误只能由解析器生成。

4
4

E_通知

运行时通知。脚本发现了一些可能是错误的内容,但正常运行脚本时也可能会发生这种情况

8
5

E_CORE_错误

PHP 初始启动期间发生的致命错误。

16
6

E_CORE_警告

非致命运行时错误。这发生在 PHP 初始启动期间。

32
7

E_USER_ERROR

用户生成的致命错误。这就像程序员使用 PHP 函数trigger_error() 设置的 E_ERROR

256
8

E_USER_警告

用户生成的非致命警告。这就像程序员使用 PHP 函数trigger_error() 设置的 E_WARNING

第512章
9

E_用户_通知

用户生成的通知。这就像程序员使用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”块中。如果异常没有触发,代码将照常继续。但是,如果触发异常,则会“抛出”异常。

  • 抛出- 这是触发异常的方式。每一次“投掷”必须至少有一次“接住”。

  • 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(), "\n";
   }
   
   // Continue execution
   echo 'Hello World';
?>

在上面的例子中,$e->getMessage函数用于获取错误消息。可以从Exception类中使用以下函数。

  • getMessage() - 异常消息

  • getCode() - 异常代码

  • getFile() - 源文件名

  • getLine() - 源行

  • getTrace() - backtrace() 的 n 数组

  • 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 错误处理函数中查看完整的错误处理函数集