我正在重构一些遗留的C++MFC代码,并遇到了以下构造:
TRY
{
// do some stuff
}
CATCH
{
// do some other stuff
}
END_CATCH
对我来说,这似乎很不寻常,我正在努力理解使用TRY/CATCH
而不是try/catch
的好处。
我看到TRY
创建了AFX_EXCEPTION_LINK
的一个实例,但我不太理解这样做的目的。我的谷歌搜索技术失败得很惨。
MFC(及其异常处理宏(早于C++98语言规范。当在MFC中使用异常时,宏试图抽象掉常见的样板代码。由于设计决策的原因,样板代码是必要的,MFC中的异常是动态分配的1,并且需要手动处理。
用C++异常处理替换MFC异常处理宏所需的步骤记录在异常:从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块中的代码,以便根据需要删除异常对象。有关更多信息,请参阅文章异常:捕获和删除异常。
以下是使用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(捕获引用