我有一個示例try/catch塊。從catch(...)獲取異常對象地址C++
try
{
...
}
catch (...)
{
...
}
有沒有什麼辦法從catch(...)塊內部獲取異常對象地址或什麼東西?
我有一個示例try/catch塊。從catch(...)獲取異常對象地址C++
try
{
...
}
catch (...)
{
...
}
有沒有什麼辦法從catch(...)塊內部獲取異常對象地址或什麼東西?
可以種使用std::current_exception()
返回爲此在C++ 11「的exception_ptr
對象指向當前處理的例外,還是它的一個副本。」但是,正如其他答案中所述,由於您不知道實際類型是什麼,所以這沒有用。請注意,針對std::exception_ptr
定義的操作很少,實際上,對其進行解引用會導致「未定義的行爲」。
關於您可以使用的唯一有趣的事情是保存指針,以便以後可以使用std::rethrow_exception
在另一個上下文中重新引用它。這是覆蓋在一些細節上MSDN article "Transporting Exceptions Between Threads."
如果你至少知道某種類型的話,那麼是的。
的catch(...)
語法不異常對象指定一個名稱,但它有可能重新拋出的對象,並使用一個更具體的catch
條款:
try {
throw 0;
}
catch(...)
{
try {
throw;
}
catch(int &i)
{
std::cout << &i << std::endl;
}
}
你會如何使用地址?
您可以通過
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
}
趕上最異常你不能做到這一點,因爲拋出的對象可以是任何可能的類型,包括普通的舊數據,如int或雙的。沒有辦法推斷它的實際類型。
即使語言給了你一個指向對象的指針,反正你也無法做任何有用的事情,至少不能以類型安全的方式。這將會像未知的數據那樣對void *。你可以嘗試RTTI,但你可以抓住你要測試的類型。
拋出的對象上的任何有用的作用涉及製備某種它的類型,假設諸如公共基類(例如std::exception
或myapp::object
),它允許實際趕上類型,使得通用catch(...)
不是必需的。
通常情況下,捕獲異常時至少要做的是打印消息。這就是爲什麼從std :: exception中推導出例外的好主意,它通過提供了什麼()函數。這消除了需要catch(...)。
我看到你的建議,並嘗試(){}趕上(SpecificExceptionType1 E2){}(SpecificExceptionType2 E2){}之間沒有差異(INT&I){} – Romeno 2011-03-01 16:36:56
這也是可以接受的將外部'catch'子句的全部內容移動到一個單獨的函數中,所以如果你有幾個地方調用一些可能拋出任何東西的外部代碼,那麼就不需要在所有的調用地點重複異常處理程序;相反,您在每次調用時放置一個catch,並在一個通用處理函數中處理異常。 – 2011-03-01 17:38:58
是的。我認爲這實際上是一個非常好的主意。 (+1) – 2013-10-23 19:35:55