try/catch 和 MFC TRY/CATCH 有啥区别?

Posted

技术标签:

【中文标题】try/catch 和 MFC TRY/CATCH 有啥区别?【英文标题】:What is the difference between try/catch and MFC TRY/CATCH?try/catch 和 MFC TRY/CATCH 有什么区别? 【发布时间】:2018-10-26 07:19:01 【问题描述】:

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

TRY

    // do some stuff

CATCH

    // do some other stuff

END_CATCH

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

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

【问题讨论】:

c++ try/catch 具有 DOS 起源,默认情况下它的支持在 cl / link 中关闭,而 mfc 处理程序有机会在那里工作。 @Але: MS DOS 于 1981 年引入。C++ 首次出现于 1985 年,但直到 1990 年之后才引入例外。您所说的不正确。 DOS 的主要编程语言是 C 和 Pascal。 【参考方案1】:

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

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

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

    找到所有出现的 MFC 宏 TRYCATCHAND_CATCHEND_CATCHTHROWTHROW_LAST

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

    TRY(替换为tryCATCH(替换为catchAND_CATCH(替换为catchEND_CATCH(删除) THROW(替换为throwTHROW_LAST(替换为throw

    修改宏参数,使它们形成有效的异常声明。

    例如,改变

    CATCH(CException, e)
    

    catch(CException* e)
    

    修改 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) 引用捕获。

【讨论】:

以上是关于try/catch 和 MFC TRY/CATCH 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

MFC TRY CATCH 与 C++ 尝试使用 MFC 捕获异常

js - try..catch详解

JavaScript里的try..catch和if...else有何区别啊

在java语言中try-catch的catch中能否再加try--catch?

try-catch的使用以及细节

javascript 多层嵌套try catch问题