從[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是最近的處理程式?
uj5u.com熱心網友回復:
例外向上傳播,因此您可以查找下一個,try然后查看它是否具有匹配的catch,如果沒有,則繼續。例如
try { // 4
try { // 2
throw "foo"; // 1
} catch(int) { } // 3
} catch(...) { // 5
std::cout << "hello exception";
}
當拋出例外時,1控制流會倒退,第一個try是2. 它沒有匹配catch,它只捕獲int( 3)。因此,您進一步向上查找以找到tryin 4。它有一個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塊已經退出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/449984.html
