我想在我的異常處理程序中執行的代碼本身可能會引發異常。嵌套的try ... catch在C++異常處理程序中?
下面的結構是合法的C++嗎?如果是的話,有什麼缺點嗎?
try
{
// ...
}
catch (const E&)
{
try
{
// ...
}
catch (const F&)
{
}
}
我想在我的異常處理程序中執行的代碼本身可能會引發異常。嵌套的try ... catch在C++異常處理程序中?
下面的結構是合法的C++嗎?如果是的話,有什麼缺點嗎?
try
{
// ...
}
catch (const E&)
{
try
{
// ...
}
catch (const F&)
{
}
}
不,沒有缺點。這就是你應該這樣做的方式。
這是一種非常有效的編碼方式。
#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;
}
事實上,甚至有使用嵌套的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(); } }
我只是喜歡避免重複[不平凡]碼!
等待,你真的可以''從嵌套函數中拋出?我從來沒有見過這樣的事情! – 2012-01-03 20:52:19
@MooingDuck:只要您從catch-block調用函數,就可以重新拋出異常。更有意思的是,這也適用於Java和C#(我最初在Java中使用這種技術來處理大量不同的數據庫異常;不過我是C++專家,而不是Java專家); – 2012-01-03 20:56:21
必須查看標準並瞭解細節和角落。 – 2012-01-03 21:22:49
是的,它完全有效。 – Anand 2012-01-03 11:37:41