异常:使用MFC宏和C++异常
本文讨论编写使用异常处理关键字的 MFC 异常处理的宏和 C++ 代码的注意事项。
本文包含以下主题:
组合的异常关键字和宏
try 块内 catch 块
组合的异常关键字和宏
可以混合使用 MFC 异常在同一程序的宏和 C++ 异常关键字。 但是,您不能与 C++ 在同一个异常关键字组合 MFC 宏块,因为宏自动删除异常对象,且在超出范围时,,而使用异常处理的关键字的代码不。 有关更多信息,请参见中的文章 异常:捕获和删除异常。
宏和关键字之间的主要差异是宏 “自动”删除所捕获的异常,则异常超出范围。 使用关键字的代码不;在 catch 块捕捉的异常块必须显式删除。 组合的宏和 C++ 异常关键字会导致内存泄漏,当异常对象不会删除时,或者堆损坏,当异常两次时被删除。
下面的代码,例如,异常无效指针:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
throw; // Invalid attempt to throw exception
// to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is invalid because
// it was deleted in the inner catch block.
}
END_CATCH
该出现问题,因为 e 删除,当通过在 “内部” CATCH 外部块时。 使用而不是 THROW 语句的 THROW_LAST 宏会导致 “extern” CATCH 块接收有效指针:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is valid because
// THROW_LAST() was used.
}
END_CATCH
try 块内 catch 块
您无法再次引发是在 CATCH 块的当前异常从 try 的内部块。 下面的示例无效:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
try
{
throw; // Wrong. Causes e (the exception
// being thrown) to be deleted.
}
catch(CException* exception)
{
exception->ReportError();
}
}
END_CATCH
有关更多信息,请参见 异常:检查异常的内容。