PHP Try Catch 示例:异常和错误处理教程
什么是异常?
错误是程序本身无法处理的意外程序结果。
错误可以通过修复程序来解决。错误的一个例子是永不停止执行的无限循环。
异常是程序无法预料的、可以由程序本身处理的后果。
异常的例子包括尝试打开不存在的文件。
可以通过创建文件或向用户提供搜索文件的选项来处理此异常。
为什么要处理异常?
- 避免在我们的页面上出现意想不到的结果,这可能会让最终用户感到非常恼火或恼火
- 通过不暴露恶意用户可能用来攻击我们应用程序的信息来提高我们应用程序的安全性
- 如果发生任何可预测的错误,Php 异常用于改变程序的正常流程。
PHP 错误处理
发生错误时,根据您的配置设置, PHP 在 Web 浏览器中显示错误消息,其中包含与发生的错误相关的信息。
PHP 提供了多种处理错误的方法。
我们将介绍三 (3) 种常用的方法;
- 模具报表– die 函数将 echo 和 exit 函数合二为一。当我们想在发生错误时输出一条消息并停止脚本执行时,它非常有用。
- 自定义错误处理程序 – 这些是用户定义的函数,在发生错误时被调用。
- PHP 错误报告 – 错误消息取决于您的 PHP 错误报告设置。当您不知道错误原因是什么时,此方法在开发环境中非常有用。显示的信息可以帮助您调试应用程序。
错误处理示例
现在让我们看一些带有错误处理例程的简单示例。
假设我们开发了一个使用文本文件存储数据的应用程序。在尝试从文件读取数据之前,我们可能需要检查文件是否存在。
下面的代码实现了上面的例子。
<?php $denominator = 0; echo 2 / $denominator; ?>
假设你将文件 simple_error.php 保存在 phptuts 文件夹中,打开 URL http://localhost/phptuts/simple_error.php
您将获得以下结果
从上面的结果可以看出,它使我们的应用程序看起来不专业并且会让用户感到烦恼。
我们将修改上述代码并为应用程序编写一个错误处理程序
<?php $denominator = 0; if ($denominator != 0) { echo 2 / $denominator; } else { echo "cannot divide by zero (0)"; } ?>
假设你将上述代码保存为 error_handling.php,打开 URL http://localhost/phptuts/error_handling.php
请注意: 显示如上所示的消息而不是显示“未找到文件”之类的消息是一种很好的安全做法。
让我们看一下另一个使用自定义错误处理程序的示例。
自定义错误处理程序将被设置为默认的 PHP 错误处理函数,并且基本上会显示错误编号和消息。
下面的代码说明了上述示例的实现
<?php function my_error_handler($error_no, $error_msg) { echo "Opps, something went wrong:"; echo "Error number: [$error_no]"; echo "Error Description: [$error_msg]"; } set_error_handler("my_error_handler"); echo (5 / 0); ?>
打开网址 http://localhost/phptuts/custom_error_handler.php 你将得到以下结果
从上面的例子中可以看出,自定义错误处理程序非常强大,因为
- 它们允许我们自定义错误消息。
- 自定义错误处理程序还可以包括文件/数据库中的错误记录、向开发人员发送电子邮件等。
现在让我们看看第三种错误处理。我们将使用 PHP 内置函数 error_reporting 。它具有以下基本语法
<?php error_reporting($reporting_level); ?>
这里,
- “error_reporting” 是 PHP 错误报告函数
- “$reporting_level” 是可选的,可用于设置报告级别。如果没有指定报告级别,PHP 将使用 php.ini 文件中指定的默认错误报告级别。
报告级别 | 描述 | 例如: |
---|---|---|
E_警告 | 仅显示警告消息。不会停止脚本的执行 | 错误报告(E_WARNING); |
E_NOTICE | 显示程序正常执行期间可能发生的通知或可能是错误的通知。 | 错误报告(E_ NOTICE); |
用户错误 | 显示用户生成的错误,即自定义错误处理程序 | 错误报告(E_ USER_ERROR); |
用户警告 | 显示用户生成的警告消息 | 错误报告(E_USER_WARNING); |
E_USER_NOTICE | 显示用户生成的通知 | 错误报告(E_USER_NOTICE); |
可恢复错误 | 显示非致命错误,并且可以使用自定义错误处理程序进行处理 | 错误报告(E_RECOVERABLE_ERROR); |
全部 | 显示所有错误和警告 | 错误报告(E_ ALL); |
错误和异常之间的区别
- 异常被抛出并被捕获,而错误通常是无法恢复的。
- 异常以面向对象的方式处理。这意味着当引发异常时;会创建一个包含异常详细信息的异常对象。
下表显示了异常对象的方法
付款方式 | 描述 | 例如: |
---|---|---|
getMessage() | 显示异常的消息 |
<?php echo $e->getMessage(); ?> |
获取代码() | 显示代表异常的数字代码 |
<?php echo $e->getCode(); ?> |
获取文件() | 显示发生异常的文件名和路径 |
<?php echo $e->getFile(); ?> |
获取线() | 显示发生异常的行号 |
<?php echo $e->getLine(); ?> |
获取Trace() | 显示异常发生前的回溯数组 |
<?php print_r( $e->getTrace()); ?> |
获取上一个() | 显示当前异常之前的前一个异常 |
<?php echo $e->getPrevious(); ?> |
获取TraceAsString() | 将异常的回溯显示为字符串而不是数组 |
<?php echo $e->getTraceAsString(); ?> |
__toString() | 将整个异常显示为字符串 |
<?php echo $e->__toString(); ?> |
以下是引发异常的基本语法。
<?php throw new Exception("This is an exception example"); ?>
这里,
- “throw”是用于抛出异常的关键字
- “new Exception(…)” 创建一个异常对象,并将“这是一个异常示例”字符串作为消息参数传递。
上述代码输出以下消息。
现在我们来看一个实现抛出和捕获异常的例子。
我们将修改上面的例子并包括try、throw和catch。
它具有以下基本语法。
<?php try { //code goes here that could potentially throw an exception } catch (Exception $e) { //exception handling code goes here } ?>
这里,
- “try{…}” 是可能引发异常的要执行的代码块
- “catch(Exception $e){…}”是捕获抛出的异常并将异常对象赋给变量$e的代码块。
下面的代码展示了实现了try、throw和catch异常的基本异常示例。
程序故意抛出异常,然后将其捕获。
<?php try { $var_msg = "This is an exception example"; throw new Exception($var_msg); } catch (Exception $e) { echo "Message: " . $e->getMessage(); echo ""; echo "getCode(): " . $e->getCode(); echo ""; echo "__toString(): " . $e->__toString(); } ?>
打开网址 http://localhost/phptuts/exception_handling.php 您将获得以下结果。
根据抛出的异常类型,还可以为一个 php try 语句创建多个异常。
请参阅文章 MySQL、PHP 数据访问… 多个异常的实现示例
多个例外
多个异常使用多个 try catch 块来处理抛出的异常。多个异常在以下情况下很有用;
- 您希望根据抛出的异常显示自定义消息
- 您希望根据抛出的异常执行唯一的操作
下面的流程图说明了多个异常的工作原理
让我们看一个使用多个异常的例子。
我们将修改将数字除以传入的分母的代码。
我们预计会发生两种类型的异常;
- 被零除
- 除以负数
为了简单起见,我们将仅在 catch 块中显示异常类型。
PHP 内置的 Exception 类用于抛出异常。
我们将创建两个扩展异常类的类并使用它们来抛出异常。
下面的代码展示了实现过程。
<?php class DivideByZeroException extends Exception {}; class DivideByNegativeException extends Exception {}; function process($denominator) { try { if ($denominator == 0) { throw new DivideByZeroException(); } else if ($denominator < 0) { throw new DivideByNegativeException(); } else { echo 25 / $denominator; } } catch (DivideByZeroException $ex) { echo "DIVIDE BY ZERO EXCEPTION!"; } catch (DivideByNegativeException $ex) { echo "DIVIDE BY NEGATIVE NUMBER EXCEPTION!"; } catch (Exception $x) { echo "UNKNOWN EXCEPTION!"; } } process(0); ?>
测试代码
我们假设您将 multiple_exceptions.php 保存在 phptuts 文件夹中。
浏览到 URL http://localhost/phptuts/multiple_exceptions.php
切换回 PHP 文件并传递 -1 作为参数,如下图所示。
浏览到 URL http://localhost/phptuts/multiple_exceptions.php.
你得到了什么结果?传递 3 作为参数。
你得到了什么结果?
总结
- 错误是 PHP 代码产生的意外结果
- 错误处理可提高应用程序性能
- PHP 具有内置函数,可用于自定义 PHP 报告错误的方式
- 异常类似于错误,但是可以在抛出时使用 catch 块捕获它们。
- 显示显示错误信息的错误消息被认为是一种不好的安全做法。