2011-11-01 63 views
5

是一個「好」的代碼?可以在終於有try/catch嗎?

 try 
     { /*stuff*/ } 
     catch (Exception e) 
     { /*stuff*/ } 
     finally 
     { 
      try 
      { /*stuff*/ } 
      catch { /*empty*/ } 
     } 

我需要做的最後操作複雜,它可能會崩潰,因爲它連接到一個數據庫

這看起來怪我,就這樣。這是正確的方式嗎?

+4

這取決於...... –

+6

如果您有健康問題,服用藥物可以嗎?我們來填補這裏的空白。最後一個try/catch的概念沒有什麼不對,但是根據你想要做什麼以及你的最終目標是什麼,可能會出現錯誤。 – corsiKa

+0

你能否簡單地告訴我們你最終會做什麼? – Purplegoldfish

回答

3

這真的要取決於你在做什麼,但個人而言,如果它是真的在其他嘗試後捕捉並完成操作後,我不會將它嵌套在最後,只要把它當作另一個try catch 。這將消除其中的一些「怪異」。

+0

這讓我再次看到整個圖片(代碼),事實上你的權利,在我的情況下,最好是刪除最後一個,並在原來的一個之後添加另一個try/catch。 – Fredou

1

嵌套try/catch塊並不理想,但在某些情況下它是必需的。只要確保正確處理任何錯誤。

0

是的。 finally中的例外將隱藏原始異常。這與推薦not to use using in WCF while creating proxies類似 - 雖然這本身是一個不同的討論。

這將輸出端B,而不是答:

static void Main(string[] args) 
    { 
     try 
     { 
      try 
      { 
       throw new ApplicationException("A"); 
      } 
      finally 
      { 
       throw new ApplicationException("B"); 
      } 
     } 
     catch (Exception e) 
     { 

      Console.WriteLine(e.Message); 
     } 
     Console.Read(); 
    } 
1

Idomatically,你可以這樣做:

try 
{ 
    /* stuff */ 
} 
catch 
{ 
    /* stuff */ 
} 
finally 
{ 
    DoStuff(); 
} 


void DoStuff() 
{ 
    try 
    { 
     /* stuff */ 
    } 
    catch 
    { 
     /* stuff */ 
    } 
} 
+0

這沒有意義,我不明白它是如何解決問題的,而且幾乎不是一個理想的情況。我會爭論兩個嘗試catch語句都應該在他們自己的方法中,一個接一個地在方法中調用。這些方法應該返回一個值。 –

0

是。通常在另一個異常處於活動狀態時拋出異常將導致第一個異常被第二個(稍後)異常取代。

下面是一些代碼,說明發生了什麼:

public static void Main(string[] args) 
    { 
     try 
     { 
      try 
      { 
       throw new Exception("first exception"); 
      } 
      finally 
      { 
       //try 
       { 
        throw new Exception("second exception"); 
       } 
       //catch (Exception) 
       { 
        //throw; 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e); 
     } 
    } 
  • 運行代碼,你會看到「第二異常」
  • 取消對try和catch語句,你會看到「第一異常」
  • 也取消註釋;聲明,你會再次看到「第二個異常」。
相關問題