首页 >后端开发 >php教程 >PHP 自定义异常

PHP 自定义异常

WBOY
WBOY原创
2024-08-29 13:06:10468浏览

当发生错误时,脚本的正常流程会停止,并且可以使用异常来更改错误。用户可以通过扩展 PHP 代码库中内置的异常类,根据图书馆、公司或我们的应用程序的要求自定义异常。在这里,我们将看到属性和成员,它们都在子类的范围内,子类从内置异常类中获取。

广告 该类别中的热门课程 PHP 开发人员 - 专业化 | 8 门课程系列 | 3次模拟测试

开始您的免费软件开发课程

网络开发、编程语言、软件测试及其他

以下是异常发生时发生的事情:

  • 首先保存代码的当前状态。
  • 异常处理程序将从代码的已保存状态继续执行、终止其执行,或者从代码的其他位置继续执行。

让我们知道为什么除了内置异常之外我们还需要自定义某些异常:

  • 我们可以轻松识别代码层次结构中哪个类、扩展或字符串生成异常。
  • 通过使用它,开发人员可以轻松发现代码中的问题。
  • 它可用于对某些库异常进行品牌化,例如 DOM、PDO 等。
  • 我们可以根据需要配置任意数量的自定义异常。

PHP 自定义异常的语法

对于要抛出的自定义异常,我们应该简单地从已经内置的 Exception 类扩展另一个类。

namespace CustExcep;
class CustException extends \Exception { }

现在创建了上面的 CustException 类,我们可以抛出一个自定义异常,如下所示:

throw new \CustExcep\CustException('Insert an Exception message here');

我们还可以根据需要自定义它以覆盖某些类属性,例如文件、代码、行及其消息,或者使用 __toString() 方法强制此异常消息采用我们必须使用的格式。

PHP 中自定义函数的工作

让我们通过几个例子来看看这个函数的工作原理:

示例#1

代码:

<?php
/**
* Here defining a class for custom exception
*/
class CustException extends Exception
{
// Here we are redefining the exception message so it is not optional
public function __construct($exmsg, $val = 0, Exception $old = null) {
// random code goes here
$exmsg = 'Default';
// ensure assignment of all values correctly
parent::__construct($exmsg, $val, $old);
}
// representing the custom string object
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function custFunc() {
echo "Insert any custom message here\n";
}
}
/**
* This class to test the exception
*/
class ExceptionTest
{
public $var;
const NO_EXCEPTION = 0;
const CUST_EXCEPTION = 1;
const DEF_EXCEPTION = 2;
function __construct($val = self::NO_EXCEPTION) {
switch ($val) {
case self::CUST_EXCEPTION:
// throw custom exception
throw new CustException('1 is considered as invalid', 5);
break;
case self::DEF_EXCEPTION:
// throw default one.
throw new Exception('2 is considered an invalid parameter', 6);
break;
default:
// Will not throw any exception and creates an object here
$this->var = $val;
break;
}
}
}
// Example 1
try {
$new = new ExceptionTest(ExceptionTest::CUST_EXCEPTION);
} catch (CustException $exp) { // This exception will be caught
echo "Test custom exception is caught\n", $exp;
$exp->custFunc();
} catch (Exception $exp) { // This is skipped
echo "Default exception is caught here\n", $exp;
}

输出:

PHP 自定义异常

说明:

  • 在这个例子中,我们将看到如何自定义抛出异常。为此,首先,我们为此目的定义一个类,在此,我们使用构造函数重新定义异常消息,使其成为非可选的。我们将异常消息设置为一些默认文本。这里我们应该确保我们使用的所有参数都被正确分配。这会导致错误。然后,我们创建另一个名为 custFunc() 的函数,并在此处定义自定义异常消息。
  • 我们使用 switch 语句为这 3 个值定义 3 个不同的自定义异常,在默认情况下,它不会抛出任何异常并创建所需的对象。
  • 为了尝试这一点,我们尝试通过将值作为 CUST_EXCEPTION 传递来创建一个新对象。这里我们将调用我们在开头定义的 custFunc() 方法。因此,这将获取定义的异常消息并显示相同的消息。

示例#2

代码:

<?php
class custException extends Exception {
public function custMsg() {
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid password. Please enter a valid one.';
return $errorMsg;
}
}
$pwd = "Password@123";
try {
//validation
if(filter_var($pwd, FILTER_VALIDATE_EMAIL) === FALSE) {
//exception thrown if password invalid
throw new custException($pwd);
}
}
catch (custException $error) {
//show custom error
echo $error->custMsg();
}
?>

输出:

PHP 自定义异常

说明:

  • 在此消息中,我们还获取了抛出正确错误的行号。我们输入密码值,然后将其与 VALIDATE_PWD 进行比较。如果返回 true,则不会抛出异常;如果结果为 false,则会抛出我们自定义的异常。

PHP 自定义异常的优点

以下是优点:

  • 内置异常很好,但从开发人员的角度来看,自定义异常更重要,因为它们可以在任何他想要的地方定位和捕获异常。
  • 易于调试,因为开发人员可以在多个点定义自定义异常并处理相同的异常。
  • 可以轻松修改现有的Exception类,并通过扩展它以更高效的方式使用它。
  • 它对于捕获“未捕获”的异常很有用。

结论

在本文中,我们看到了自定义定义和异常处理的概念。还有其他情况可以使用它,例如在 try-catch 块中,通过抛出多个异常、重新抛出某些异常、设置顶级异常处理程序等

以上是PHP 自定义异常的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn