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