2011-03-01 27 views

回答

2

可以使用std::current_exception()返回爲此在C++ 11「的exception_ptr對象指向當前處理的例外,還是它的一個副本。」但是,正如其他答案中所述,由於您不知道實際類型是什麼,所以這沒有用。請注意,針對std::exception_ptr定義的操作很少,實際上,對其進行解引用會導致「未定義的行爲」。

關於您可以使用的唯一有趣的事情是保存指針,以便以後可以使用std::rethrow_exception在另一個上下文中重新引用它。這是覆蓋在一些細節上MSDN article "Transporting Exceptions Between Threads."

2

如果你至少知道某種類型的話,那麼是的。

catch(...)語法不異常對象指定一個名稱,但它有可能重新拋出的對象,並使用一個更具體的catch條款:

try { 
    throw 0; 
} 
catch(...) 
{ 
    try { 
     throw; 
    } 
    catch(int &i) 
    { 
     std::cout << &i << std::endl; 
    } 
} 
+1

我看到你的建議,並嘗試(){}趕上(SpecificExceptionType1 E2){}(SpecificExceptionType2 E2){}之間沒有差異(INT&I){} – Romeno 2011-03-01 16:36:56

+0

這也是可以接受的將外部'catch'子句的全部內容移動到一個單獨的函數中,所以如果你有幾個地方調用一些可能拋出任何東西的外部代碼,那麼就不需要在所有的調用地點重複異常處理程序;相反,您在每次調用時放置一個catch,並在一個通用處理函數中處理異常。 – 2011-03-01 17:38:58

+0

是的。我認爲這實際上是一個非常好的主意。 (+1) – 2013-10-23 19:35:55

1

你會如何使用地址?

您可以通過

try { 
    // something 
} 
catch (const std::exception& e) 
{ 
    // e will be anything derived from std::exception 
} 
catch(...) 
{ 
    // any other error, that you know nothing about 
    // possibly log it as a problem, and 
    throw; // pass it on to someone else that might know how to handle it 
} 
1

趕上最異常你不能做到這一點,因爲拋出的對象可以是任何可能的類型,包括普通的舊數據,如int或雙的。沒有辦法推斷它的實際類型。

即使語言給了你一個指向對象的指針,反正你也無法做任何有用的事情,至少不能以類型安全的方式。這將會像未知的數據那樣對void *。你可以嘗試RTTI,但你可以抓住你要測試的類型。

拋出的對象上的任何有用的作用涉及製備某種它的類型,假設諸如公共基類(例如std::exceptionmyapp::object),它允許實際趕上類型,使得通用catch(...)不是必需的。

通常情況下,捕獲異常時至少要做的是打印消息。這就是爲什麼從std :: exception中推導出例外的好主意,它通過提供了什麼()函數。這消除了需要catch(...)