2009-02-16 37 views
13

我可以嵌套try-catch塊嗎? 例如:我可以在C++中嵌套try-catch塊嗎?


void f() 
{ 
    try 
    { 
     //Some code 
     try 
     { 
      //Some code 
     } 
     catch(ExceptionA a) 
     { 
      //Some specific exception handling 
     } 
     //Some code 
    } 
    catch(...) 
    { 
     //Some exception handling 
    } 
}//f 
+3

你只是喜歡這些認爲自己比其他人更聰明的人,並認爲自己擁有這個網站 – 2009-02-16 15:22:03

+2

我通常會給這些類型的問題帶來懷疑:僅僅因爲它對編譯器有效並不意味着它就是其中的一部分的標準。反過來也是如此。 – rmeador 2009-02-16 15:28:21

回答

19

是完全合法的。

雖然這將是最好的內部的人進入另一種方法,所以它看起來更乾淨,你的方法(S)是小

1

是的,你可以。

7

如前所述,這是可能的,但你必須看到「落空' - 在這方面。如果在第一個try-catch-block中你的異常被捕獲,它將不會被外部catch-block捕獲。但是,如果它沒有被內部catch-block捕獲,它將嘗試在外部catch-block中找到匹配的異常處理程序。

您也可以明確地進一步在內部異常處理程序使用throw;引發異常到下一個異常處理。

例如下面的代碼:

try 
{ 
    try 
    { 
     throw std::runtime_error("Test"); 
    } 
    catch (std::runtime_error& e) 
    { 
     std::cerr << "Inner Exception-Handler: " << e.what() << std::endl; 
     throw; 
    } 
} 
catch (std::exception& e) 
{ 
    std::cerr << "Outer Exception-Handler: " << e.what() << std::endl; 
}

會導致:

Inner Exception-Handler: Test 
Outer Exception-Handler: Test

這工作,因爲std::runtime_error is derived from std::exception。 你還應該注意到,在這樣一個簡單的例子中,也可以將catch-blocks彼此相繼編寫,但是如果你想在第一個catch塊之後執行其他代碼,則必須嵌套它們。

1

它的法律,但它並不是所有有用的,除非你是從你的內部catch()拋出一個異常。例如,您可能想要捕獲系統級異常,但爲了代碼清晰度而拋出自己的異常對象。

5

是的,這是合法的。正如ouster所說,處理它的一種方法是將內部try-catch塊放入其自己的函數中,並從外部try-catch塊調用該函數。

處理它的另一種方法是使用多個catch塊。

void f() 
{ 
    try 
    { 
     //Some code that throws ExceptionA 
     //Some code that throws ExceptionB 
    } 
    catch(ExceptionA ea) 
    { 
     //Some exception handling 
    } 
    catch(ExceptionB eb) 
    { 
     //Some exception handling 
    } 
}//f 

這裏要小心的是catch塊中異常類型的特殊性。如果ExceptionB在上面的例子中擴展了ExceptionA,那麼ExceptionB塊永遠不會被調用,因爲任何被拋出的ExceptionB都將被ExceptionA塊處理。處理Exception類層次結構時,您必須以最具體到最不具體的順序排列catch塊。