2011-01-20 65 views
2

我們通常設置消息在實例化,像這樣:PHP的異常處理設置消息之後

throw new Exception($msg);` 

,但我在一個情況下,我必須存儲在一個實例變量默認的例外對象,並用它通過了對象生命週期,這樣的事情:

throw $this->my_exception; 

因爲我重用相同的對象,我需要能夠在throwning異常前的任何時間設置郵件,看到了嗎?

+2

爲什麼地球上它會這樣工作?如果您重複使用該例外,那麼行號可能是錯誤的,因爲您已經拋出它?拋出一個新的有什麼不對? – 2011-01-20 14:12:31

+0

如果我可能會問:你是做什麼的? – NikiC 2011-01-20 14:13:54

+0

@jakenoble:客戶端代碼需要能夠注入他/她的偏好的異常對象;我知道這聽起來很奇怪,但我需要它... – fabio 2011-01-20 14:24:16

回答

4

不要這樣做。它使追蹤異常變得更加困難(因爲堆棧跟蹤將不包括重新拋出)。相反,如果你使用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"); 

它仍然不是很好,因爲例外被認爲具有語義意義(因此LogicExceptionInvalidArgumentException的存在),但是如果它是一個要求,這不是一個可怕的方式(但預先實例化異常是一個可怕的方式)。 ..

6

創建一個自定義異常:

class MyException extends Exception 
{ 
    public function setMessage($message) { 
     $this->message = $message; 
    } 
} 

然後你就可以創建並拋出該異常

$this->exception = new MyException; 
// ... 
$this->exception->setMessage('Bad stuff happened'); 
throw $this->expection; 

雖然老實說,我不明白你爲什麼會做這樣的事情。