考慮下面的代碼片段:從標準嵌套的處理程序是否影響異常的生命週期?
struct ExceptionBase : virtual std::exception{};
struct SomeSpecificError : virtual ExceptionBase{};
struct SomeOtherError : virtual ExceptionBase{};
void MightThrow();
void HandleException();
void ReportError();
int main()
{
try
{
MightThrow();
}
catch(...)
{
HandleException();
}
}
void MightThrow()
{
throw SomeSpecificError();
}
void HandleException()
{
try
{
throw;
}
catch(ExceptionBase const &)
{
// common error processing
}
try
{
throw;
}
catch(SomeSpecificError const &)
{
// specific error processing
}
catch(SomeOtherError const &)
{
// other error processing
}
ReportError();
}
void ReportError()
{
}
15.1.4節告訴我們:
被拋出的 在未指定的方式分配給例外的臨時副本存儲,除了3.7.3.1中提到的情況外。只要有對 該異常正在執行的處理程序 暫時持續。特別是,如果處理程序通過執行 投擲而退出;語句,該控制權將控制權交給另一個處理程序,用於處理相同的異常,所以暫時保留。 當最後一個處理程序被 爲異常退出由不是拋出其他任何手段執行; 臨時對象被銷燬並且執行可能爲該臨時對象釋放內存 ;任何這樣的解除分配都是以未指定的方式在 中完成的。銷燬 破壞在 處理異常聲明中表示的對象之後立即發生。
我正確查看main
中的處理程序是否爲「最後處理程序?」。因此在HandleException
中允許任何數量的rethrow和catch都不會導致當前異常對象被破壞?
¤'main'中的處理程序是最後一個,是的。是的,您可以根據需要多次重新拋出和重新排除異常。但是,這不是一個好主意。相反,讓您的處理程序執行(1)純粹的異常轉換,或者(2)純粹的日誌記錄和終止。這個處理程序代碼自然不具備處理失敗的知識。歡呼&hth。, – 2011-12-21 21:25:08
@Alf謝謝。似乎我在發佈小代碼示例時省略了一些重要細節。實際上,ExceptionBase來自boost :: exception(從中提取許多常見的上下文數據)。此外,'main'實際上是任意數量的COM方法之一,因此在返回適當的HRESULT代碼之前記錄錯誤(包括常見和錯誤特定的上下文數據)。但無論如何,你已經回答了我的問題。 – 2011-12-21 21:56:22