我正在重构一些遗留的C++ MFC代码并且遇到了这个结构:
TRY
{
// do some stuff
}
CATCH
{
// do some other stuff
}
END_CATCH
Run Code Online (Sandbox Code Playgroud)
对我而言,这似乎很不寻常,我试图了解使用TRY/CATCH赞成的好处是什么try/catch.
我看到它TRY创建了一个实例,AFX_EXCEPTION_LINK我不太明白这个的目的.我的谷歌搜索技巧失败了.
MFC(及其异常处理宏)早于 C++98 语言规范。当在 MFC 中使用异常时,宏尝试抽象出常见的样板代码。由于设计决策,样板代码是必要的,MFC 中的异常是动态分配的1,并且需要手动处理。
将 MFC 异常处理宏替换为 C++ 异常处理所需的步骤记录在异常:从 MFC 异常宏转换中:
将使用宏的代码转换为使用 C++ 异常处理关键字
找到所有出现的 MFC 宏
TRY、CATCH、AND_CATCH、END_CATCH、THROW和THROW_LAST。替换或删除所有出现的以下宏:
TRY(将其替换为try)CATCH(将其替换为catch)AND_CATCH(将其替换为catch)END_CATCH(删除它)THROW(将其替换为throw)THROW_LAST(将其替换为throw)修改宏参数,使它们形成有效的异常声明。
例如,改变
Run Code Online (Sandbox Code Playgroud)CATCH(CException, e)到
Run Code Online (Sandbox Code Playgroud)catch(CException* e)修改 catch 块中的代码,以便根据需要删除异常对象。有关更多信息,请参阅文章异常:捕获和删除异常。
下面是使用 MFC 异常宏的异常处理代码的示例。请注意,由于以下示例中的代码使用了宏,因此异常
e会自动删除:Run Code Online (Sandbox Code Playgroud)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++ 异常关键字,因此必须显式删除异常:
Run Code Online (Sandbox Code Playgroud)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) 引用捕获。