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为您提供了一个定义错误处理函数的框架.

此函数必须能够处理至少两个参数(错误级别和错误消息),但最多可以接受五个参数(可选) :file,line-number和错误上下文) :

语法

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

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

可能的错误级别

这些错误报告级别是用户定义的错误处理程序可用于的不同类型的错误.这些值使用 | 运算符组合使用

Sr.NoConstant&说明价值
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函数设置的E_ERROR trigger_error()

256
8

E_USER_WARNING

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

512
9

E_USER_NOTICE

用户生成的通知.这类似于程序员使用PHP函数设置的E_NOTICE:trigger_error()

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有一个类似于其他编程语言的异常模型.例外很重要,可以更好地控制错误处理.

让我们解释一下与异常相关的新关键字.

  • 尝试 : 使用异常的函数应该在"try"块中.如果异常未触发,则代码将继续正常进行.但是,如果异常触发,则会抛出异常.

  • 投掷 : 这是您触发异常的方式.每个"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函数用于获取错误消息.可以从异常类中使用以下函数.

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