如果您打算创建许多自定义异常,您可能会发现此代码很有用。我创建了一个接口和一个抽象异常类,以确保内置 Exception 类的所有部分都保留在子类中。它还将所有信息正确地推送到父构造函数,以确保没有任何信息丢失。这允许您快速创建新的异常。它还使用更全面的方法覆盖了默认的 __toString 方法。
<?php
接口 IException
{
/* 从 Exception 类继承的受保护方法 */
public function getMessage(); // 异常消息
public function getCode(); // 用户自定义的异常代码
public function getFile(); // 源文件名
public function getLine(); // 源代码行
public function getTrace(); // 回溯的数组
public function getTraceAsString(); // 格式化的回溯字符串
/* 从 Exception 类继承的可重写方法 */
public function __toString(); // 用于显示的格式化字符串
public function __construct($message = null, $code = 0);
}
抽象类 CustomException 扩展 Exception 并实现 IException
{
protected $message = '未知异常'; // 异常消息
private $string; // 未知
protected $code = 0; // 用户自定义的异常代码
protected $file; // 异常的源文件名
protected $line; // 异常的源代码行
private $trace; // 未知
public function __construct($message = null, $code = 0)
{
if (!$message) {
throw new $this('未知 '. get_class($this));
}
parent::__construct($message, $code);
}
public function __toString()
{
return get_class($this) . " '{$this->message}' 在 {$this->file}({$this->line})\n"
. "{$this->getTraceAsString()}";
}
}
?>
现在你可以一行创建新的异常
<?php
类 TestException 扩展 CustomException {}
?>
这是一个测试,它展示了所有信息如何在整个回溯过程中正确保留。
<?php
函数 exceptionTest()
{
try {
throw new TestException();
}
catch (TestException $e) {
echo "捕获到 TestException ('{$e->getMessage()}')\n{$e}\n";
}
catch (Exception $e) {
echo "捕获到 Exception ('{$e->getMessage()}')\n{$e}\n";
}
}
echo '<pre>' . exceptionTest() . '</pre>';
?>
这是一个示例输出
捕获到 TestException ('未知 TestException')
TestException '未知 TestException' 在 C:\xampp\htdocs\CustomException\CustomException.php(31)
#0 C:\xampp\htdocs\CustomException\ExceptionTest.php(19): CustomException->__construct()
#1 C:\xampp\htdocs\CustomException\ExceptionTest.php(43): exceptionTest()
#2 {main}