2013-08-23 43 views
1

經過下面的代碼當我們爲一個try塊創建多個catch時,首先執行哪個塊?爲什麼?

例子:

try 
{ 
    //some code is executing.. 
    //1.some SqlException thrown 
    //2.some FormatException thrown 
    //3. other Exception thrown 
} 
catch(SqlException sqlex) 
{ 
    Console.WriteLine("sqlexception is returned"); 
} 
catch(FormatException fx) 
{ 
    Console.WriteLine("FormatException is returned"); 
} 
catch(Exception ex) 
{ 
    Console.WriteLine("Mainexception is returned"); 
} 
catch 
{ 
    Console.WriteLine("exception without any args is returned"); 
} 
  1. 可能是什麼,它的輸出,爲什麼?

  2. 哪個catch塊會先執行,爲什麼?

  3. 如果我在try塊之後立即聲明catch(Exception ex),那麼它將不會編譯,並且會給其他catch塊發出錯誤 - 「之前的catch子句捕獲所有的異常」 - 這個catch塊參數System.Exception作爲主異常或主異常塊..?如果是的話爲什麼..?

請提前告知並提供幫助。

+0

很好的說明可在MSDN:使用異常(http://msdn.microsoft.com/en-us/library/ms173161.aspx)和[異常和異常處理(HTTP其他幾個主題: //msdn.microsoft.com/en-us/library/ms173160.aspx) –

回答

1

滿足條件的第一個catch(該條件還包括從該類型繼承的異常類型),將執行拋出的異常類型。這就是爲什麼你先在列表中放置更多特定的異常類型,並在底部放置最通用的異常類型。

在你的榜樣,最後catch將不會執行,因爲它上面的catch(Exception ex)將捕獲所有的異常,因爲每個例外是基於System.Exception類。

因此,從您發佈的代碼中,唯一的保證是最後一個將永遠不會執行,如果您使用的是嚴格的.NET代碼,那麼在.NET之外生成的異常可能不會從System.Exception繼承。對於所有其他人而言,它取決於哪一個實際執行的異常類型。

+0

感謝您的答案,我重新編輯我的問題是更具體的,所以如果我沒有錯,如果編譯器沒有找到具體的在我的代碼中的異常類型,那麼它將下降到主要的異常,即System.Exception,正確。 –

+0

最後一個catch *可以執行:它會捕獲任何不從System.Exception繼承的異常;例如,不屬於.net的代碼拋出的任何內容。見http://stackoverflow.com/questions/10805987/catch-vs-catch-exception-e-and-throw-vs-throw-e –

+0

@AdrianWragg - 好吧,這是真的,但在這種情況下不大可能。 –

0

有多個catch語句的原因是,它允許您爲不同類型的異常提供處理程序。因此,在你的例子:

catch(SqlException sqlex) 
    catch(FormatException fx) 
    catch(Exception ex) 
    catch 
  • 如果代碼觸發SqlException(從它繼承或任何異常),那麼內的代碼將運行。
  • 如果一個FormatException,那麼該塊中的代碼。
  • 從基類Exception派生的所有其他異常,第三個將運行。
  • 其他(主要是非.NET代碼引發的錯誤),第四個。

如果第三個代碼移動,代碼無法編譯的原因是所有內置的異常都是Exception本身的子類;如果首先處理Exception,那麼這些處理程序永遠不能運行。

+0

非常感謝分享:)我更好地理解現在.. –

+0

@PrathapSVGenny如果這些問題的答案之一 - 並不一定是我的,不會生氣 - 回答您的問題,這是值得接受它,這樣其他人有類似問題可以看到什麼對你有用。 –

0
  try 
      { 
       //some code is executing.. 

      } 
      catch(SqlException sqlex) 
      { 
       // sql exception goes here 
       Console.WriteLine("sqlexception is returned"); 
      } 
      catch (FormatException fx) 
      { 
       //format exception goes here 
       Console.WriteLine("FormatException is returned"); 
      } 
      catch (Exception ex) 
      { 
       // Any other or general exception goes here 
       Console.WriteLine("Mainexception is returned"); 
      } 
      catch 
      { 
       //none of the exceptions for this catch 
       Console.WriteLine("exception without any args is returned"); 
      } 
2

把事情放在簡單的字裏: catch塊依次工作。 即根據定義的匹配例外來捕獲哪個捕獲塊。 例如如果你在頂部定義一個通用的異常catch塊,它將捕獲所有類型的異常,其他catch塊將永遠不會被調用。 所以在你的例子中,Karl定義的第4個catch塊永遠不會被調用。

相關問題