2009-11-17 95 views
4

我讀了很多關於如何不好抓基地例外是,我必須承認,我確實也:如何在Windows登錄異常窗體應用程序

try{ 
    ... 
} 
catch (Exception exception){ 
    MessageBox.Show(exception.Message, "Error!"); 
    MyLogger.Log(exception.Message); 
} 

現在我想這樣做的權利,並有關於它的一些問題:

  1. 哪些異常我應該抓住(例如FileNotExists的文件操作,但什麼的TableAdapter或ReportClass(水晶報表))
  2. 我在哪裏可以看到異常的列表,即一個對象可以扔(前例)充足TableAdapter)
  3. 在Windows窗體應用程序中,我可以設置一個靜態方法,它將記錄任何例外的文件例如
  4. 其他建議嗎?

回答

7
  1. 捕獲任何你可以合理處理的異常。例如,如果你想要打開一個文件進行寫入,你應該期望這個文件被標記爲只讀,這樣就會拋出一個異常。但是,在相同的情況下,您不會嘗試捕獲空參數異常,因爲這是由於程序員錯誤造成的。

  2. 他們應該在MSDN中的函數參考中找到(你必須在每個函數中查找它)。對於用戶定義的函數,除非有其他文檔或摘要評論,否則您必須進行挖掘。

3,4,考慮使用logging library for .NET

+0

我同意所有這些觀點。我還要補充一點,對於你自己的拋出異常的方法,重要的是要記錄在哪種情況下引發哪個異常,以便調用者知道如何處理它。 – 2009-11-17 15:41:56

+0

任何***良好的模式和實踐***(可能在MSDN-微軟)關於Windows窗體_中的_Logging和異常_('UnhandledException,Application.ThreadException事件'等)? – Kiquenet 2017-03-01 08:33:49

+0

http://stackoverflow.com/questions/1715439/best-logging-library-for-net/1715446#1715446 ***未找到*** – Kiquenet 2017-03-01 08:34:37

1

你應該只捕捉異常,你可以做些什麼,真的。

這就是經驗法則。我通常會在我的Program.Main周圍試一試,以防萬一發生異常冒泡並需要記錄。如果在除UI線程之外的其他線程中拋出異常(假設您是多線程的),則還可以處理CurrentDomain_UnhandledException事件。

2
  1. 這是由你來決定哪些異常應用程序邏輯可以合理地期望從中恢復。
  2. 異常是由方法調用引發的,而不是對象引發的。在Visual Studio中,Intellisense的解釋將告訴你哪些異常是由對象拋出的(假設XML文檔描述了一種方法拋出的異常)。有例子。 MSDN
5

我有一件事要補充。如果你只是想記錄異常,而不影響程序流程,你總是可以做到這一點:

try 
{ 
    ... 
} 
catch (Exception exception) 
{  
    MyLogger.Log(exception.Message); 

    throw; 
}
2

您可以在應用程序事件未處理異常事件集文件

(有一個VB樣品這裏,但我希望你明白了)

Private Sub MyApplication_UnhandledException(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException 

    End Sub 

您可以在項目的選項中找到應用程序事件。

1

在回答「4.任何其他建議?」:

在你的示例代碼,正在登錄異常之前顯示一個消息框。我建議您在顯示消息之前記錄異常情況,以防萬一用戶看到錯誤消息,恐慌,並在沒有點擊「確定」的情況下休假。這是一件小事,但消息框無限期地阻止了該程序,應謹慎使用!

相關問題