2010-05-18 63 views
5

的異常中操作我知道這可能是一個有點古怪,但懷疑畢竟是一個疑問...... 在以下情況下會發生什麼......異常在C#

private void SendMail() 
{ 
    try 
    { 
     //i try to send a mail and it throws an exception 
    } 
    catch(Exception ex) 
    { 
     //so i will handle that exception over here 
     //and since an exception occurred while sending a mail 
     //i will log an event with the eventlog 

     //All i want to know is what if an exception occurs here 
     //while writing the error log, how should i handle it?? 
    } 
} 

謝謝。

回答

4

我會親自包裝調用以寫入事件日誌與另一個try \ catch語句。

但是,最終取決於您的規格。如果系統將故障寫入事件日誌至關重要,那麼您應該允許將其拋出。然而,根據你的例子,我懷疑這是你想要做的。

+6

+1。順便說一句:「喲狗,我聽說你喜歡捕捉異常,所以我把一個嘗試抓住你的試驗抓住,所以你趕上,而你趕上。」 :) – ANeves 2010-05-18 09:39:03

+0

哈哈輝煌!!!!!!!就我而言,本週評論! – 2010-05-18 09:55:06

+0

嘿大衛, 即使我相信你是正確的,我們應該讓第二個異常被拋出,因爲最終如果在那裏拋出一個異常,那麼這將意味着客戶端機器存在的問題.... 和我們的第一個偏好是與我們的應用程序相關的例外... 但是我怎麼知道我的應用程序中發生了什麼錯誤,因爲既沒有發送郵件也沒有記錄錯誤? 任何建議好友 – Shrewdroid 2010-05-18 10:00:58

0

您也可以在catch塊中添加try-catch塊。

1

每個異常僅在try-catch塊內被捕獲。你可以嵌套嘗試,但通常不是一個好主意。

+0

對,嵌套try-catch塊感覺「髒」。但是,沒有什麼別的辦法可以做。 – 2010-05-18 09:41:11

0

考慮到寫入文件時的異常類型(權限,磁盤空間...)我建議不要在這裏處理它。如果第一次失敗,很有可能無法在事件日誌中寫入事件日誌中無法寫入的信息...

讓它冒泡並由上級處理試着抓。

4

您可以簡單地捕獲錯誤記錄方法中的錯誤。但是我不會親自這樣做,因爲錯誤日誌記錄是您的應用程序根本無法運行的標誌。

private void SendMail() 
{ 
    try 
    { 
     //i try to send a mail and it throws an exception 
    } 
    catch(Exception ex) 
    { 
     WriteToLog(); 
    } 
} 

private void WriteToLog() 
{ 
    try 
    { 
     // Write to the Log 
    } 
    catch(Exception ex) 
    { 
     // Error Will Robinson 
     // You should probably make this error catching specialized instead of pokeman error handling 
    } 
} 
+0

+1 Yep - writeToLog應該處理自己的異常(抑制或拋出) – 2010-05-18 19:20:00

0

Chris S.有最好的答案。在catch塊內放置try-catch塊是非常不明智的。並在你的情況下,它會只是纏繞你的代碼。如果您在這裏查看是否成功寫入日誌文件,那麼您必須在每個嘗試寫入日誌文件的地方執行此操作。在通知/處理這些模塊中的錯誤條件時,您可以通過讓所有單獨的模塊自成一體,輕鬆避免這種不必要的代碼重複。當您的郵件發送失敗,你執行你的catch塊內適當的行動來處理這一特殊情況,如:

  1. 處置您的郵件對象
  2. 的確保您的插座已關閉
  3. 內容編寫的條目到你的日誌文件中注意錯誤

在你的catch塊中,只需調用你定義的任何API來將日誌條目寫入你的日誌文件中,而忘記其餘的。在你的日誌API裏面,你應該處理任何與日誌有關的例外情況(磁盤已滿,沒有寫入文件的權限,找不到文件的權限等等)。您的郵件模塊不需要知道日誌記錄是否成功,應該將責任委派給日誌記錄模塊。

0

我個人使用簡單的擴展方法來處理這種情況。

public static class MyExtentions 
{ 
    public static void LogToErrorFile(this Exception exception) 
    { 
     try 
     { 
      System.IO.File.AppendAllText(System.IO.Path.Combine(Application.StartupPath, "error_log.txt"), 
       String.Format("{0}\tProgram Error: {1}\n", DateTime.Now, exception.ToString())); 
     } 
     catch 
     { 
      // Handle however you wish 
     } 
    } 
} 

的用法很簡單:

try 
{ 
    ... 
} 
catch(Exception ex) 
{ 
    ex.LogToErrorFile(); 
} 

然後,您可以處理擴展方法中捕捉到的異常,但是你想,或者乾脆不抓住它,讓它泡到頂部。我發現這種設計是一種簡單,可重複的方式來處理整個應用程序中的異常。

0