[英]How I can determine the "nearest" exception handler
來自[except.throw]/2 :
當拋出異常時,控制權將轉移到最近的具有匹配類型([except.handle])的處理程序; “最近”是指 try 關鍵字后的復合語句或 ctor-initializer 最近由控制線程輸入且尚未退出的處理程序。
首先,我真的無法正確理解這句話,以及它是如何應用於特定代碼的。 因此,任何可以理解的解釋,用簡單的文字,將不勝感激。
考慮這兩個代碼片段:
/ * code A */
try
{
throw 1;
}
catch (int) // nearest handler for throwing 1. #first_handler
{
}
-----------------------------------------------
/* code B */
try
{
try
{
throw 1;
}
catch (int) // nearest handler for throwing 1. #second_handler
{
throw 2;
}
}
catch (int) // nearest handler for throwing 2
{
}
因為我無法理解上面的引用,所以我不知道如何確定最近的處理程序,並且我無法在上面的示例中應用[except.throw]/2
。 我的問題是如何在上面的代碼中應用[except.throw]/2
? 或者換句話說,為什么first_handler
和second_handler
是最近的處理程序?
異常向上傳播,因此您可以尋找下一次try
,然后查看它是否具有匹配的catch
,如果沒有則繼續。 例如
try { // 4
try { // 2
throw "foo"; // 1
} catch(int) { } // 3
} catch(...) { // 5
std::cout << "hello exception";
}
當在1
中拋出異常時,控制流向后退,第一次try
是在2
中。 它沒有匹配的catch
,它只捕獲int
( 3
)。 因此,您進一步向上查找以找到4
中的try
。 它有一個catch
可以捕獲任何異常5
,這是“最近的”。
[...] ““最近的”是指 try 關鍵字后的復合語句最近由控制線程輸入且尚未退出的處理程序。” 什么是“尚未退出”? 我無法得到大膽的部分。
那是第二個例子:
try // try 2
{
try // try 1
{
throw 1;
} // <---- the try block is exited here
catch (int) // catch 1
{
throw 2;
}
}
catch (int) // catch 2
{
}
throw 2
將由catch 2
處理,因為那是最近的處理程序。 最近的處理程序不是catch 1
,因為它屬於try 1
。 當執行throw 2
時, try 1
塊已經退出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.