2011-08-25 49 views
2

我已經將一個winforms程序類分解爲一個單獨的DLL。 DLL使用try-catch來捕獲錯誤。當仍然是winforms類時,我會捕獲錯誤,記錄它,然後通過MessageBox通知用戶。有了DLL,我正在捕獲錯誤,記錄它 - 但不知道如何通知用戶有錯誤?將錯誤消息從C#DLL返回給C#程序?

我怎樣才能最好的通知,有在DLL中的一個錯誤的用戶?

+2

捕獲所有異常幾乎總是一個壞主意,特別是這樣做爲時尚早。 catch子句屬於表單,而不是你的DLL。 –

回答

4

不要捕捉錯誤!抓住它,記錄它然後rethrow它,如果你必須,但不要吞下例外。讓它傳播到主機應用程序,然後它可以隨意處理它(例如顯示一個消息框)。

7

如果你想記錄它,那麼好了,抓住它,記錄它,然後拋出一個適當的異常,讓消費者決定如何最好地處理它。如果你有沒有價值增加,並沒有語義改變,那麼就做你的DLL中:

catch(SpecificException ex) 
{ 
    LogException(ex); 
    throw; 
} 

如果你有更多信息的添加,然後拋出一個合適的新的異常,使用適當的構造函數包含捕獲的異常,作爲innerException值。

你不應該做什麼(我見過太多人嘗試)是「智能」地確定什麼類型的應用程序消耗的DLL,並嘗試從DLL中顯示的UI。即使您確實使所有當前的使用情況都正確(「它只能用於WinForms應用程序」),您現在已經限制了未來的重用潛力。

你應該讓消費者決定自己的錯誤處理策略,而不是試圖強加一個從DLL中。

1

我能想到的一種方式是從DLL中拋出一個通用的異常,您可以在其中捕獲應用程序,然後顯示相應從dll返回的消息。 似乎不是那麼明智。

1

你應該繼續拋出異常的DLL(您已經登錄後)

一個好的做法是對付在最後可能的機會,錯誤和異常。你的情況應該在winform應用程序中。

1

正如其他人所說,記錄後拋出異常。如果你在該dll中有一個單獨的線程/定時器,並且沒有任何東西可以拋出,通知主機應用程序可以偵聽的事件。