2012-01-03 76 views
13

我想在我的異常處理程序中執行的代碼本身可能會引發異常。嵌套的try ... catch在C++異常處理程序中?

下面的結構是合法的C++嗎?如果是的話,有什麼缺點嗎?

try 
{ 
    // ... 
} 
catch (const E&) 
{ 
    try 
    { 
     // ... 
    } 
    catch (const F&) 
    { 

    } 
} 
+0

是的,它完全有效。 – Anand 2012-01-03 11:37:41

回答

15

不,沒有缺點。這就是你應該這樣做的方式。

4

這是一種非常有效的編碼方式。

#include <iostream> 
using namespace std; 



int main(int argc, char* argv[]) 
{ 
     try  //outer try{} 
     { 
       try //inner try{} 
       { 
        throw std::runtime_error("Demo"); 
       } 
       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; 
     } 

    return 0; 
} 
17

事實上,甚至有使用嵌套的try/catch塊一個有趣的技術:假設你有有效需要相同的異常處理多種功能。特別是在包裝另一個界面時,這是常見的情況。在這種情況下,可以捕獲所有異常,請從異常處理程序的功能,並在此功能重新拋出異常實現實際的異常處理:

void fancy_handler() { 
    try { 
     throw; // assumes that fancy_handler() is called from catch-clause 
    } catch (std::runtime_error const& rt) { 
     std::cout << "runtime-error: " << ex.what() << "\n"; 
    } catch (std::exception const& ex) { 
     std::cout << "excption: " << ex.what() << "\n"; 
    } catch (...) { 
     std::cout << "unknown exception\n"; 
    } 
} 

void foo() { try { do_foo(); } catch (...) { fancy_handler(); } } 
void bar() { try { do_bar(); } catch (...) { fancy_handler(); } } 

我只是喜歡避免重複[不平凡]碼!

+0

等待,你真的可以''從嵌套函數中拋出?我從來沒有見過這樣的事情! – 2012-01-03 20:52:19

+1

@MooingDuck:只要您從catch-block調用函數,就可以重新拋出異常。更有意思的是,這也適用於Java和C#(我最初在Java中使用這種技術來處理大量不同的數據庫異常;不過我是C++專家,而不是Java專家); – 2012-01-03 20:56:21

+0

必須查看標準並瞭解細節和角落。 – 2012-01-03 21:22:49