try / catch和MFC TRY / CATCH有什么区别?

时间:2018-10-26 07:19:01

标签: visual-c++ mfc

我正在重构一些旧的C ++ MFC代码,并遇到了这种结构:

TRY
{
    // do some stuff
}
CATCH
{
    // do some other stuff
}
END_CATCH

在我看来,这很不寻常,我试图了解使用TRY/CATCH代替try/catch有什么好处。

我看到TRY创建了AFX_EXCEPTION_LINK的实例,但我不太了解其目的。我的谷歌搜索技能失败了。

1 个答案:

答案 0 :(得分:4)

MFC(及其exception processing宏)早于C ++ 98语言规范。当在MFC中使用异常时,宏会尝试将常见的样板代码提取掉。由于设计决定,需要样板代码,而MFC中的异常是动态分配的 1 ,并且需要手动处理。

Exceptions: Converting from MFC Exception Macros下记录了用C ++异常处理替换MFC异常处理宏所需的步骤:

  

使用宏将代码转换为使用C ++异常处理关键字

     
      
  1. 找到所有出现的MFC宏TRYCATCHAND_CATCHEND_CATCHTHROWTHROW_LAST

  2.   
  3. 替换或删除所有出现的以下宏:

         
        
    • TRY(用try替换)
    •   
    • CATCH(用catch替换)
    •   
    • AND_CATCH(用catch替换)
    •   
    • END_CATCH(删除)
    •   
    • THROW(用throw替换)
    •   
    • THROW_LAST(用throw替换)
    •   
  4.   
  5. 修改宏参数,以便它们形成有效的异常声明。

         

    例如,更改

    CATCH(CException, e)
    
         

    catch(CException* e)
    
  6.   
  7. 修改catch块中的代码,以便根据需要删除异常对象。有关更多信息,请参见文章Exceptions: Catching and Deleting Exceptions

  8.   
     

这是使用MFC异常宏的异常处理代码的示例。请注意,由于以下示例中的代码使用了宏,因此会自动删除异常e

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();
   if (m_bReturnFromThisFunction)
      return;
   // Not necessary to delete the exception e.
}
END_CATCH
     

下一个示例中的代码使用C ++异常关键字,因此必须显式删除该异常:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;
   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }
   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }
   e->Delete();
}

只要您记得通过调用CException::Delete手动删除MFC异常,转换几乎就是机械的。


1 这与当今的C ++异常处理约定相反:按值抛出,按(常量)引用捕获。