错误是程序本身无法处理的意外程序结果。
通过修复程序可以解决错误。 错误的一个例子是永不停止执行的无限循环。
异常是程序本身可以处理的意外程序结果。
异常示例包括尝试打开不存在的文件。
可以通过创建文件或向用户提供搜索文件的选项来处理此异常。
发生错误时,PHP会根据您的配置设置,在Web浏览器中显示错误消息以及与发生的错误有关的信息。
PHP提供了多种处理错误的方法。
我们将研究三(3)种常用方法;
现在让我们看一些带有错误处理例程的简单示例。
假设我们已经开发了一个使用文本文件存储数据的应用程序。 在尝试从文件中读取数据之前,我们可能需要检查文件是否存在。
下面的代码实现了上面的示例。
<?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);
?>
打开URL http://localhost/phptuts/custom_error_handler.php您将获得以下结果
从上面的示例中可以看到,自定义错误处理程序在以下方面具有强大的功能:
现在让我们看一下第三种错误处理。 我们将使用PHP内置的函数error_reporting函数。 它具有以下基本语法
<?php
error_reporting($reporting_level);
?>
这里,
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(); ?> |
以下是引发异常的基本语法。
<?php
throw new Exception("This is an exception example");
?>
这里,
上面的代码输出以下消息。
现在,我们将看一个实现throw和catch异常的示例。
我们将修改上面的示例,并包括尝试,抛出和捕获。
它具有以下基本语法。
<?php
try {
//code goes here that could potentially throw an exception
}
catch (Exception $e) {
//exception handling code goes here
}
?>
这里,
下面的代码显示了实现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();
}
?>
打开URL http://localhost/phptuts/exception_handling.php您将获得以下结果。
根据抛出的异常类型,也可以为一个php try语句创建多个异常。
有关多个异常的实现示例,请参见有关MySQL,PHP数据访问…的文章。
多个异常使用多个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);
?>
测试代码
我们将假定您将multiple_exceptions.php保存在phptuts文件夹中。
浏览到URL http://localhost/phptuts/multiple_exceptions.php
切换回PHP文件,并通过-1作为参数,如下图所示。
浏览到URL http://localhost/phptuts/multiple_exceptions.php。
您得到什么结果? 传递3作为参数。
您得到什么结果?