我們通常設置消息在實例化,像這樣:PHP的異常處理設置消息之後
throw new Exception($msg);`
,但我在一個情況下,我必須存儲在一個實例變量默認的例外對象,並用它通過了對象生命週期,這樣的事情:
throw $this->my_exception;
因爲我重用相同的對象,我需要能夠在throwning異常前的任何時間設置郵件,看到了嗎?
我們通常設置消息在實例化,像這樣:PHP的異常處理設置消息之後
throw new Exception($msg);`
,但我在一個情況下,我必須存儲在一個實例變量默認的例外對象,並用它通過了對象生命週期,這樣的事情:
throw $this->my_exception;
因爲我重用相同的對象,我需要能夠在throwning異常前的任何時間設置郵件,看到了嗎?
不要這樣做。它使追蹤異常變得更加困難(因爲堆棧跟蹤將不包括重新拋出)。相反,如果你使用5.3+使用$previous
parameter,做一個新的異常:
throw new Exception("message", 0, $this->my_exception);
即使你使用小於5.3,你可以擴展異常類,並將其添加...
編輯:好的,根據你的意見,我看到你現在正在嘗試做什麼。你想讓你的類拋出一個可配置的異常。我會做什麼,是在一個字符串類名和存儲。所以$this->my_exception
將是一個字符串。你應該確認它是一個異常類在存放前,因爲你不能扔東西,不從Exception
擴展:
if (!is_subclass_of($this->my_exception, 'Exception')) {
//Error out, since you can't throw that class name
}
然後,當它的時候拋出:
$class = $this->my_exception;
throw new $class("MyMessage");
它仍然不是很好,因爲例外被認爲具有語義意義(因此LogicException
和InvalidArgumentException
的存在),但是如果它是一個要求,這不是一個可怕的方式(但預先實例化異常是一個可怕的方式)。 ..
創建一個自定義異常:
class MyException extends Exception
{
public function setMessage($message) {
$this->message = $message;
}
}
然後你就可以創建並拋出該異常
$this->exception = new MyException;
// ...
$this->exception->setMessage('Bad stuff happened');
throw $this->expection;
雖然老實說,我不明白你爲什麼會做這樣的事情。
爲什麼地球上它會這樣工作?如果您重複使用該例外,那麼行號可能是錯誤的,因爲您已經拋出它?拋出一個新的有什麼不對? – 2011-01-20 14:12:31
如果我可能會問:你是做什麼的? – NikiC 2011-01-20 14:13:54
@jakenoble:客戶端代碼需要能夠注入他/她的偏好的異常對象;我知道這聽起來很奇怪,但我需要它... – fabio 2011-01-20 14:24:16