|
PHP 5 增加了類似於其它語系的異常處理模組,可以在 PHP
內檢驗(try)、拋出(throw)和捕捉(catch)異常。一個
try 至少要有一個與之對應的 catch。定義多個 catch 可以捕捉不同的對象。PHP
會按這些 catch 被定義的順序執行,直到完成最後一個為止。而在這些 catch
內,又可以拋出新的異常。
當一個異常被拋出時,其後(譯者註:指拋出異常時所在的代碼塊)的代碼將不會繼續執行,而 PHP
就會嘗試尋找第一個能與之符合的 catch。若果一個異常沒有被捕捉,而且又沒用使用
set_exception_handler() 作相應的處理的話,那麼 PHP
將會產生一個嚴重的錯誤,並且輸出未能捕捉異常的提示訊息。
例子 20-1. 拋出一個異常
<?php try { $error = 'Always throw this error'; throw new Exception($error);
// 從這裡開始,tra 代碼塊內的代碼將不會被執行 echo 'Never executed';
} catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; }
// 繼續執行 echo 'Hello World'; ?>
|
|
會員可以用自訂的異常處理類來增加 PHP
內建的異常處理類。以下的代碼說明了在內建的異常處理類中,哪些屬性和方法在子類中是可訪問和可繼承的。譯者註:以下這段代碼只為說明內建異常處理類的結構,它並不是一段有實際意義的可用代碼。
例子 20-2. 內建的異常處理類
<?php class Exception { protected $message = 'Unknown exception'; // 異常訊息 protected $code = 0; // 會員自訂異常代碼 protected $file; // 發生異常的檔案名 protected $line; // 發生異常的代碼行號
function __construct($message = null, $code = 0);
final function getMessage(); // 返回異常訊息 final function getCode(); // 返回異常代碼 final function getFile(); // 返回發生異常的檔案名 final function getLine(); // 返回發生異常的代碼行號 final function getTrace(); // backtrace() 陣列 final function getTraceAsString(); // 已格成化成字串的 getTrace() 訊息
/* 可重載的方法 */ function __toString(); // 可輸出的字串 } ?>
|
|
若果使用自訂的類來增加內建異常處理類,並且要重新定義構造函數的話,建議同時呼叫
parent::__construct()
來檢查所有的變量是否已被賦值。當物件要輸出字串的時候,可以重載
__toString() 並自訂輸出的型態。
例子 20-3. 增加 PHP 內建的異常處理類
<?php /** * 自訂一個異常處理類 */ class MyException extends Exception { // 重定義構造器使 message 變為必須被特殊的屬性 public function __construct($message, $code = 0) { // 自訂的代碼
// 確保所有變量都被正確賦值 parent::__construct($message, $code); }
// 自訂字串輸出的型態 */ public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; }
public function customFunction() { echo "A Custom function for this type of exception\n"; } }
/** * 建立一個用於測試異常處理機制的類 */ class TestException { public $var;
const THROW_NONE = 0; const THROW_CUSTOM = 1; const THROW_DEFAULT = 2;
function __construct($avalue = self::THROW_NONE) {
switch ($avalue) { case self::THROW_CUSTOM: // 拋出自訂異常 throw new MyException('1 is an invalid parameter', 5); break;
case self::THROW_DEFAULT: // 拋出預設的異常 throw new Exception('2 isnt allowed as a parameter', 6); break;
default: // 沒有異常的情況下,建立一個物件 $this->var = $avalue; break; } } }
// 例子 1 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (MyException $e) { // 捕捉異常 echo "Caught my exception\n", $e; $e->customFunction(); } catch (Exception $e) { // 被忽略 echo "Caught Default Exception\n", $e; }
// 執行後續代碼 var_dump($o); echo "\n\n";
// 例子 2 try { $o = new TestException(TestException::THROW_DEFAULT); } catch (MyException $e) { // 不能符合異常的種類,被忽略 echo "Caught my exception\n", $e; $e->customFunction(); } catch (Exception $e) { // 捕捉異常 echo "Caught Default Exception\n", $e; }
// 執行後續代碼 var_dump($o); echo "\n\n";
// 例子 3 try { $o = new TestException(TestException::THROW_CUSTOM); } catch (Exception $e) { // 捕捉異常 echo "Default Exception caught\n", $e; }
// 執行後續代碼 var_dump($o); echo "\n\n";
// 例子 4 try { $o = new TestException(); } catch (Exception $e) { // 沒有異常,被忽略 echo "Default Exception caught\n", $e; }
// 執行後續代碼 var_dump($o); echo "\n\n"; ?>
|
|
| |