为什么要处理异常?
避免在我们的页面上出现意想不到的结果,这些结果可能会使我们的最终用户感到非常烦恼或恼怒
通过不公开恶意用户可能用来攻击我们的应用程序的信息来提高我们的应用程序的安全性
如果发生任何可预测的错误,则使用Php Exceptions来更改程序的正常流程。
PHP错误处理
发生错误时,PHP会根据您的配置设置,在Web浏览器中显示错误消息以及与发生的错误有关的信息。
PHP提供了多种处理错误的方法。
Die语句– Die函数将echo和exit函数合二为一。 当我们要输出一条消息并在发生错误时停止脚本执行时,此功能非常有用。
自定义错误处理程序–这些是用户定义的函数,每当发生错误时都会调用它们。
PHP错误报告–错误消息取决于您的PHP错误报告设置。 当您不知道导致错误的原因时,此方法在开发环境中非常有用。 显示的信息可以帮助您调试应用程序。
错误处理示例
我们使用PHP内置的函数error_reporting函数。 它具有以下基本语法
<?php
error_reporting($reportingLevel);
?>
这里,
“ error_reporting”是PHP错误报告功能
“ $ reportingLevel”是可选的,可用于设置报告级别,如果未指定报告级别,PHP将使用php.ini文件中指定的默认错误报告级别。
Reporting Level | 描述 | Example |
E_WARNING | 仅显示警告消息。 不停止脚本的执行 | error_reporting(E_WARNING); |
E_NOTICE | 显示可能在程序正常执行期间发生或可能为错误的通知。 | error_reporting(E_ NOTICE); |
E_USER_ERROR | 显示用户生成的错误,即自定义错误处理程序 | error_reporting(E_ USER_ERROR); |
E_USER_WARNING | 显示用户生成的警告消息 | error_reporting(E_USER_WARNING); |
E_USER_NOTICE | 显示用户生成的通知 | error_reporting(E_USER_NOTICE); |
E_RECOVERABLE_ERROR | 显示并非致命的错误,可以使用自定义错误处理程序进行处理 | error_reporting(E_RECOVERABLE_ERROR); |
E_ALL | 显示所有错误和警告 | error_reporting(E_ ALL); |
错误与异常之间的区别
抛出异常并打算捕获异常,而错误通常是无法恢复的。
异常以面向对象的方式处理。
这意味着当抛出异常时; 创建一个包含异常详细信息的异常对象。
下表显示了异常对象方法
Method | 描述 | Example |
getMessage() | 显示异常的消息 | <?php echo $e->getMessage(); ?> |
getCode() | 显示代表异常的数字代码 | <?php echo $e->getCode(); ?> |
getFile() | 显示发生异常的文件名和路径 | <?php echo $e->getFile(); ?> |
getLine() | 显示发生异常的行号 | <?php echo $e->getLine(); ?> |
getTrace() | 在异常之前显示回溯的数组 | <?php print_r( $e->getTrace()); ?> |
getPrevious() | 显示当前异常之前的上一个异常 | <?php echo $e->getPrevious(); ?> |
getTraceAsString() | 将异常的回溯显示为字符串而不是数组 | <?php echo $e->getTraceAsString(); ?> |
__toString() | 将整个异常显示为字符串 | <?php echo $e->__toString(); ?> |
我自己的常用的是getMessage(),getCode(),getFile(),getLine()
以下是引发异常的基本语法。
<?php
throw new Exception("This is an exception example");
?>
这里,
“ throw”是用于引发异常的关键字
“ new Exception(…)”创建一个异常对象,并传递“ This is a exception example”字符串作为消息参数。
现在,我们将看一个实现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 {
$varMsg = "This is an exception example";
throw new Exception($varMsg);
}
catch (Exception $e) {
$error = [
'message' => $e->getMessage(),
'code' => $e->getCode(),
'file' => $e->getFile(),
'fileLine' => $e->getLine()
];
/*
*这里一般做写入日志处理
*/
var_dump($error);
}
?>
根据抛出的异常类型,也可以为一个php try语句创建多个异常。
有关多个异常的实现示例,请参见有关MySQL,PHP官网。
多个Exceptions
多个异常使用多个try catch块来处理引发的异常。 多个异常在以下情况下很有用:
您要根据抛出的异常显示自定义消息
您要根据抛出的异常执行唯一的操作
下面的流程图说明了多个异常的工作方式

让我们看一个使用多个异常的示例。
我们将修改将数字除以传入的分母的代码。
我们预计会发生两种类型的异常;
被零除
除以负数
为简单起见,我们将仅在catch块中显示异常类型。
内置于Exception类的PHP用于引发异常。
我们将创建两个扩展异常类的类,并使用它们引发异常。
<?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);
?>
概括
错误是PHP代码产生的意外结果
错误处理可提高应用程序性能
PHP具有内置功能,可用于自定义PHP报告错误的方式
异常就像错误一样,但是可以在抛出异常时使用catch块来捕获异常。
显示显示错误信息的错误消息被认为是不良的安全做法。