异常:使用 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
有关更多信息,请参见 异常:检查异常的内容。