簡體   English   中英

我如何確定“最近的”異常處理程序

[英]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_handlersecond_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM