簡體   English   中英

使用多個類時,一般處理Try / Catch塊和錯誤的正確方法是什么?

[英]What's the correct way to deal with Try/Catch Blocks and Errors in General when using multiple classes?

我試圖在這里理解程序的正確結構以促進一切。 基本上在哪里“放”東西。

例如:

你有2個班級。

1級是你的主力。

這兩個類都有很多方法。

Class 1調用Class 2的實例並運行一個方法。 該方法應該返回一個值。

問題1:我是否應該在此方法中使用try / catch塊(在第2類中)?

問題2:try / catch塊應該在我調用方法的地方(在Class 1中)嗎?

try
   method();
catch
...

問題3:當執行類2中的方法時,在返回值時,我是否應該返回“錯誤代碼”然后在調用類中處理此代碼?

問題4:當一個錯誤發生並且我需要“暫停”程序時,我是否應該使用if / else語句,以便只有在滿足正確條件時代碼才會向前移動,或者我應該更頻繁地使用關鍵字“break”?

問題5:錯誤的可能性可能是無窮無盡的,特別是如果你有大中型程序。 你們如何處理用戶運行程序時可能遇到的不可知錯誤?

例外就是:例外。 您不應該使用常規程序流的例外。 (如果你說,“哦,是的,我期待的那樣”,它可能不應該是一個例外。)

處理需要處理的異常。 如果你能在沒有try-catch塊成功的情況下繼續使用該函數,那么你應該在那里處理它。 類似地,如果你需要包裝一些東西,你也可以添加一個finally塊( using類似於finally在C#中 - 它編譯為try-finally ,但不像自己編寫那樣健壯。它只是調用.Dispose()指定的一次性對象)。

但是如果您需要擺脫該功能,或者您正在運行一系列需要在主類中取得成功的函數,那么在類1中進行處理可能會更好。

警告:每條規則都有例外(哈!)。 隨着您的編程越來越多,您可以直觀地了解應該在哪里進行錯誤處理 - 但通常會有多個選項,而且可能並不明確。

一般來說,所有這些問題的答案都是“它取決於”。 顯然,您需要做的事情取決於具體情況及其包含的應用程序。

從實踐的角度來看,我通常遵循一些規則:
1.使用異常處理而不是錯誤代碼
2.當我知道如何處理異常時,只使用try / catch

顯然沒有人能夠告訴你在方法中是否需要try / catch而不知道該方法的作用以及是否可以處理任何異常。

錯誤代碼是否真的適用取決於您。 我一般認為它不適用; 但是,有時它可能會。 在這些情況下,如果調用者始終使用代碼而不傳遞代碼,我只會將其視為適用。 “GetErrorCode”可能是錯誤代碼可能適用的一個很好的例子。

你不可能“處理”(即補償)“未知”錯誤。 建議的做法是不處理異常並讓句柄正常終止,因為它處於未知狀態。

我總體上同意大衛和彼得......我要補充的一件事就是要小心你抓到它們時遇到的異常...... 里希特有一個關於異常處理的非常有趣的章節,以及如何繼承異常被支持與他們實際實現的方式相比......但即使如此,如果你發現自己一直在捕捉通用的Exception類,那么(IMO)是懶惰的,或者至少是經過深思熟慮......

如果你正在進行文件讀/寫,你很可能想要捕獲適當的IO異常,但是為了始終捕獲最通用的異常類會導致你遇到問題,如果拋出NullReferenceException並且你的try / catch只是保護針對IO Exceptions ...你的catch塊會嘗試修復(它假設的)一個IO異常,它可能會使你的代碼處於一個非常不穩定的狀態。

另外,要非常小心繼續重新拋出原始錯誤,除非你確信你正確處理它...如果你寫了一個庫並發布它並吞下所有錯誤,因為你認為你做的最好,那么消耗你的庫的人將無法調試正在發生的事情......異常也會被拋入服務器日志中,因此吞下的錯誤永遠不會讓它存在。

我主張捕獲泛型錯誤的一個地方是在UI層,你顯然不希望向用戶顯示YSOD,但即便如此,你的捕獲應該可能會做一些日志記錄或某些東西來幫助你稍后調試。

捕獲異常並返回錯誤代碼/ bool導致“箭頭”代碼如下:

if(Func1())
{
   if (Func2())
   {
       if (Func3())
       {
       }
   }
}

遺憾的是,我維持了一個復雜的項目,其中異常被視為埃博拉病毒,並且一旦發芽就被包含在內。 它實際上只是使代碼更難理解和維護。

這取決於您如何可視化和構建應用程序。 1類和2類是同一模塊的一部分還是屬於不同的模塊? 通常,模塊提供“API”,“API”的調用者需要捕獲錯誤和異常。 看看防守編程

問題1:我是否應該在此方法中使用try / catch塊(在第2類中)?

如果Class 2是一個單獨的模塊,並且您不希望將異常傳播給調用者模塊,那么是。 如果你願意,那么沒有。 然后需要記錄從此類/模塊拋出的異常。

如果類1和2在同一個模塊中,那么它又取決於您是否要在內部類中處理異常。

問題2:try / catch塊應該在我調用方法的地方(在Class 1中)嗎?

如果您想保護以確保第1類不會引發進一步的例外,那么是。

問題3:當執行類2中的方法時,在返回值時,我是否應該返回“錯誤代碼”然后在調用類中處理此代碼?

如果要拋出異常返回錯誤代碼,則再次是設計/實現決策。

問題4:當一個錯誤發生並且我需要“暫停”程序時,我是否應該使用if / else語句,以便只有在滿足正確條件時代碼才會向前移動,或者我應該更頻繁地使用關鍵字“break”?

要使用break,您需要在調用者中使用循環。

問題5:錯誤的可能性可能是無窮無盡的,特別是如果你有大中型程序。 你們如何處理用戶運行程序時可能遇到的不可知錯誤?

大型程序分為模塊,可由不同的開發人員編寫。 因此,設計和界面合同在這里變得至關重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM