如果您打算建立許多自訂例外,您可能會發現這段程式碼很有用。我建立了一個介面和一個抽象例外類別,以確保內建 Exception 類別的所有部分都保留在子類別中。它還會正確地將所有資訊推送回父建構函式,確保不會遺失任何資訊。這讓您可以快速建立新的例外。它還覆寫了預設的 __toString 方法,使其更加完善。
<?php
介面 IException
{
/* 從 Exception 類別繼承的受保護方法 */
public function getMessage(); // 例外訊息
public function getCode(); // 使用者定義的例外代碼
public function getFile(); // 來源檔案名稱
public function getLine(); // 來源行數
public function getTrace(); // backtrace() 的陣列
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}