异常:使用 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

有关更多信息,请参见 异常:检查异常的内容

请参见

概念

MFC 中的异常处理