try/catch和MFC try/catch之间有什么区别



我正在重构一些遗留的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++异常处理关键字

  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块中的代码,以便根据需要删除异常对象。有关更多信息,请参阅文章异常:捕获和删除异常。

以下是使用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(捕获引用

最新更新