2009-06-02 55 views
2

我們所有人都使用try catch塊。但是在自定義函數中處理錯誤的最佳方式是什麼?在自定義函數內處理異常

當引發異常時(如果可能的話在函數中)顯示一個消息框給用戶,或者返回一個值表示在函數中發現了一個錯誤?

回答

2

它確實取決於函數,但總的來說,我會建議不要讓它顯示一個MessageBox給用戶;這是用戶界面的一項任務。如果函數(出於任何正當理由)確實顯示一個MessageBox,則提供一個保證爲「無聲」的重載,以便該函數的調用者可以阻止該MessageBox。但是,正如我所說的,我認爲最好讓調用者決定如何處理異常。畢竟,這可能是從沒有UI的Windows服務調用函數。

我通常使用這些方法之一:

  • 沒有捕獲異常可言,而是讓它泡向上。這是通過在函數中不執行try-catch塊來完成的。
  • 抓住異常,用它做一些事情(比如記錄它),然後重新拋出它。
  • 捕獲異常,將其包裝(作爲InnerException)作爲拋出的新異常,可能已完成一些日誌記錄。

這適用於函數本身無法處理異常的情況。在某些情況下,函數可能會處理異常狀態並繼續執行其工作。在這些情況下,函數當然不會拋出異常。

+1

如果您想讓它冒泡,請使用Andy建議的應用程序級異常處理程序。這樣,您可以記錄異常情況,如果需要顯示消息框以及可能需要執行的任何其他操作。 – 2009-06-04 19:26:50

+0

@Sam:非常好的建議 – 2009-06-04 19:28:17

0

我讓我所有的錯誤冒泡到頂層,我使用應用程序錯誤處理程序來處理它們。

如果我有一個特定的錯誤,我知道可以發生在一個函數中,並且該函數可以處理它,那麼我就可以。

超時,對象引用沒有設置等等到最高處理程序。

0

不要捕捉你無法做的事情。充斥着try/catch塊的代碼很難閱讀,這意味着您的異常處理代碼不包含在一個地方以方便維護。

如果你是剛剛登錄異常或提醒用戶,這應該在堆棧的頂部來完成(或者在您的應用層邊界)。使用Application.ThreadException事件和AppDomain.CurrentDomain.UnhandledException事件並將它們掛接到Sub Main方法中的事件處理程序。