如果你打算创建很多自定义异常,你可能会发现这段代码很有用。我创建了一个接口和一个抽象异常类,它确保所有内置 Exception 类的一部分都被保留在子类中。它还将所有信息正确地推送到父构造函数,确保没有任何丢失。这允许你快速创建新的异常。它还使用更全面的方法覆盖了默认的 __toString 方法。
<?php
interface 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);
}
abstract class CustomException extends Exception implements IException
{
protected $message = 'Unknown exception'; // 异常消息
private $string; // 未知
protected $code = 0; // 用户定义的异常代码
protected $file; // 异常发生的源文件名
protected $line; // 异常发生的源行
private $trace; // 未知
public function __construct($message = null, $code = 0)
{
if (!$message) {
throw new $this('Unknown '. get_class($this));
}
parent::__construct($message, $code);
}
public function __toString()
{
return get_class($this) . " '{$this->message}' in {$this->file}({$this->line})\n"
. "{$this->getTraceAsString()}";
}
}
?>
现在您可以一行代码创建新的异常
<?php
class TestException extends CustomException {}
?>
这是一个测试,它展示了所有信息如何在整个回溯中被正确保存。
<?php
function exceptionTest()
{
try {
throw new TestException();
}
catch (TestException $e) {
echo "Caught TestException ('{$e->getMessage()}')\n{$e}\n";
}
catch (Exception $e) {
echo "Caught Exception ('{$e->getMessage()}')\n{$e}\n";
}
}
echo '<pre>' . exceptionTest() . '</pre>';
?>
这是一个示例输出
Caught TestException ('Unknown TestException')
TestException 'Unknown TestException' in 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}