2011-06-03 64 views
3

This user asked a similar question但在答案中沒有可行的解決方案,所以這裏是我們重新討論的主題。如何擴展異常以發送電子郵件

我想以一種乾淨的方式發送自定義例外的電子郵件。我可以通過自定義的error_handler來完成這個簡單的舊錯誤,但是對於擴展的異常我有點難住。

主要問題是我依靠Zend_Mail來實現透明的跨平臺郵件傳輸,簡單的smtp/ssl配置以及gmail賬號使用和一堆其他好東西。我想在自定義異常中訪問我的Zend_Mail對象。靜態調用並不是我願意使用的選項,儘管它似乎是在自定義異常中使用第三方對象最簡單的方法。這裏是基本異常類的建築工:

public function __construct($message = null, $code = 0, 
          Exception $previous = null); 

唯一的解決辦法,我認爲可能是在當其時增加了對郵件的對象參數在擴展異常類是值得的,但我不希望要求所有子類傳入郵件對象。這個想法是,也許這個郵件程序。作爲可選的依賴關係會更好。然後

__construct簽名會變成:

 public function __construct($mailobj = null, $message = null, $code = 0, 
            Exception $previous = null); 

注意參數的順序,只需要$代碼,它是在標籤的中間!這提出了另一個問題,但那是另一天。我今天的問題是,有沒有人有關於如何處理自定義異常類中的依賴關係的想法/建議?請注意我們的目標是測試代碼。

另一種簡單的選擇本來有一個catch塊郵件代碼,但那種失敗在我看來,使用自定義異常的目的,因爲這個類的客戶端現在必須考慮加郵寄代碼在所有catch塊中。

回答

1

每當這個異常被實例化(即throw new CustomException()),有人將收到一封電子郵件,我想接​​近它像這樣(我在這裏缺少一些要求嗎?)

class CustomException extends Exception // Zend_Exception? 
{ 
    public function __construct($message = null, $code = 0, Exception $previous = null) { 
     $mailobj = new Zend_Mail(/* ... */); 
     // .... 
     try { // In order not to get infinitelly looped 
      $mailobj->send(/*...*/); 
     } catch(Exception $e) { } 
    } 
} 

+1

嘿,這是一個有點有趣的選擇。我不確定在異常情況下可以拋出異常並捕獲異常,但是當我測試這個時,我們很快就會發現它。這個簡單的場景讓我重新考慮了異常的價值,考慮了在一個普通的錯誤處理程序中這是多麼容易。儘管公平我在錯誤處理程序中使用了靜態變量,但在錯誤處理程序中實現自定義錯誤行爲似乎比在異常中更容易。感謝您的反饋朋友。 – stefgosselin 2011-06-03 16:04:53

+0

我看不出有什麼理由說明爲什麼一個異常不能在內部產生(拋出)另一個異常 - 在這一點上它仍然是一個常規的代碼執行。然而,在你引用的討論中,人們正在考慮'__destruct'選項,你會有限的能力,因爲那時執行正在終止,你可能(我不確定你是否會)有限制,如不能夠創建新的對象(例如'new Zend_Mail()')。但是,析構函數選項的優點是在執行之前允許暫停/修改,而​​在這裏您不能阻止發送電子郵件。 – mkilmanas 2011-06-03 18:58:56

+0

我採取了與此非常相似的措施。唯一的區別是我已經將郵件對象創建放在一個單獨的函數中,以使我有一個更清晰的構造器,並且對於我想郵寄的錯誤以及那些我不需要的錯誤有更多的靈活性。感謝您的反饋! – stefgosselin 2011-06-06 15:45:56