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

问题描述 投票:5回答:1

我正在重构一些遗留的C ++ MFC代码并且遇到了这个结构:

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

对我来说,这似乎很不寻常,我试图了解使用TRY/CATCH有利于try/catch的好处是什么。

我看到TRY创建了AFX_EXCEPTION_LINK的一个实例,我不太明白这个的目的。我的谷歌搜索技巧失败了。

visual-c++ mfc
1个回答
4
投票

MFC(及其exception processing宏)早于C ++ 98语言规范。在MFC中使用异常时,宏会尝试抽象掉常见的样板代码。由于设计决策,样板代码是必要的,MFC中的异常是动态分配的,需要手动处理。

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

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

  1. 找到所有出现的MFC宏TRYCATCHAND_CATCHEND_CATCHTHROWTHROW_LAST
  2. 替换或删除以下所有出现的宏: TRY(用try代替) CATCH(用catch代替) AND_CATCH(用catch代替) END_CATCH(删除它) THROW(用throw代替) THROW_LAST(用throw代替)
  3. 修改宏参数,以便它们形成有效的异常声明。 例如,改变 CATCH(CException, e) catch(CException* e)
  4. 修改catch块中的代码,以便根据需要删除异常对象。有关更多信息,请参阅文章Exceptions: Catching and Deleting Exceptions

以下是使用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 ++异常处理约定形成对比:按值抛出,按(const)引用捕获。

© www.soinside.com 2019 - 2024. All rights reserved.