PHP 异常处理
异常处理是PHP中的一个强大机制,用于处理运行时错误(运行时错误被称为异常)。以便可以保持应用程序的正常流程。
使用异常处理的主要目的是 保持应用程序的正常执行 。
什么是异常
异常是程序的一个意外结果,可以由程序本身处理。基本上,异常会中断程序的正常流程。但它和错误不同,异常可以被程序本身处理,而错误无法被程序本身处理。
换句话说,“程序的一个意外结果是异常,可以由程序本身处理。” 在PHP中,可以抛出和捕获异常。
为什么需要异常处理
PHP提供了一个强大的机制——异常处理。它允许您处理运行时错误,例如IOException、SQLException、ClassNotFoundException等。异常处理最常见的示例是除以零异常,即算术异常。
注意:当异常中断程序或应用程序的正常执行时,需要使用异常处理。
异常处理在所有编程语言中几乎都是相似的。它在指定的错误条件发生时改变程序的正常流程,这种条件被称为异常。PHP为此提供了以下关键字:
尝试(try)-
尝试块包含可能引发异常或可能在其中出现异常的代码。当在运行时代码的尝试块内发生异常时,它将在catch块中捕获和解决。尝试块必须跟随catch或finally块。一个尝试块可以跟随一个或多个catch块。
捕获(catch)-
捕获块包含在抛出指定异常时执行的代码。它总是与try块一起使用,而不是单独使用。当发生异常时,PHP查找匹配的捕获块。
抛出(throw)-
这是一个用于抛出异常的关键字。它还有助于列出函数抛出但其本身不处理的所有异常。
请记住,每个throw都必须至少有一个“catch”。
最后(finally)-
最后块包含在PHP中进行清理活动的代码。基本上,它执行程序的必要代码。
当触发异常时会发生什么
- 保存代码的当前状态。
- 将代码的执行切换到预定义的异常处理函数。
- 根据情况,处理程序可以停止程序的执行,从保存的代码状态中恢复执行,或从代码中的另一个位置继续执行。
异常处理相对于错误处理的优势
异常处理是PHP中的一个重要机制,它相对于错误处理具有以下优势-
错误类型的分组-
在PHP中,可以将基本类型和对象都作为异常抛出。它可以创建异常对象的层次结构,并按照类型对异常进行组合,还可以根据它们的类型对异常进行分类。
保持错误处理和正常代码分离 –
在传统的错误处理中,使用if-else块来处理错误。这使得代码变得难以阅读,因为处理错误和条件的代码混在一起。在try-catch块中,异常与代码分开,使代码可读性增强。
示例
通过示例学习PHP中的异常处理工作原理-
示例1
让我们通过一个示例来解释throw和try-catch块的常见流程:
<?php
//user-defined function with an exception
function checkNumber(num) {
if(num>=1) {
//throw an exception
throw new Exception("Value must be less than 1");
}
return true;
}
//trigger an exception in a "try" block
try {
checkNumber(5);
//If the exception throws, below text will not be display
echo 'If you see this text, the passed value is less than 1';
}
//catch exception
catch (Exception e) {
echo 'Exception Message: ' .e->getMessage();
}
?>
输出:
Exception Message: Value must be less than 1
示例2:创建自定义异常
您可以通过扩展Exception类来创建用户定义的异常。请查看下面的代码,了解如何创建用户定义的异常 –
<?php
class DivideByZeroException extends Exception { }
class DivideByNegativeNoException extends Exception { }
function checkdivisor(dividend,divisor){
// Throw exception if divisor is zero
try {
if (divisor == 0) {
throw new DivideByZeroException;
} else if (divisor < 0) {
throw new DivideByNegativeNoException;
}
else {
result =dividend / divisor;
echo "Result of division =result </br>";
}
}
catch (DivideByZeroException dze) {
echo "Divide by Zero Exception! </br>";
}
catch (DivideByNegativeNoExceptiondnne) {
echo "Divide by Negative Number Exception </br>";
}
catch (Exception $ex) {
echo "Unknown Exception";
}
}
checkdivisor(18, 3);
checkdivisor(34, -6);
checkdivisor(27, 0);
?>
输出:
Result of division = 6
Divide by Zero Exception!
Divide by Negative Number Exception!
要详细了解try-catch块的更多信息, 点此处 。