我正在重构一些旧的C ++ MFC代码,并遇到了这种结构:
TRY
{
// do some stuff
}
CATCH
{
// do some other stuff
}
END_CATCH
在我看来,这很不寻常,我试图了解使用TRY/CATCH
代替try/catch
有什么好处。
我看到TRY
创建了AFX_EXCEPTION_LINK
的实例,但我不太了解其目的。我的谷歌搜索技能失败了。
答案 0 :(得分:4)
MFC(及其exception processing宏)早于C ++ 98语言规范。当在MFC中使用异常时,宏会尝试将常见的样板代码提取掉。由于设计决定,需要样板代码,而MFC中的异常是动态分配的 1 ,并且需要手动处理。
Exceptions: Converting from MFC Exception Macros下记录了用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
替换)修改宏参数,以便它们形成有效的异常声明。
例如,更改
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 ++异常处理约定相反:按值抛出,按(常量)引用捕获。