异常:使用 MFC 宏及 C++ 异常

来源:互联网 发布:编程机器人2.0 编辑:程序博客网 时间:2024/06/09 14:24

本文论述同时使用 MFC 异常处理宏及 C++ 异常处理关键字编写代码时的注意事项。

本文阐述了以下主题:

  • 混合使用异常关键字与宏
  • Catch 块内部的 Try 块

混合使用异常关键字与宏

可在同一程序中混合使用 MFC 异常宏及 C++ 异常关键字。但不可在同一个块中混合使用 MFC 宏及 C++ 异常关键字,因为当异常对象超出范围时宏自动将其删除,而使用异常处理关键字的代码则不会。有关更多信息,请参见文章异常:捕捉和删除异常。

宏与关键字之间的主要差异是,当异常超出范围时宏“自动”删除捕捉到的异常。使用关键字的代码则不然;在 catch 块中捕捉到的异常必须被显式删除。当异常对象未被删除时混合使用宏及 C++ 异常关键字可导致内存泄漏,当异常被删除两次时则会导致堆损坏。

例如,下列代码使异常指针无效:

TRY{    TRY    {        // Do something to throw an exception.    }    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

该问题的发生是因为当执行从“内部”CATCH 块传出时 e 被删除。使用 THROW_LAST 宏而不是 THROW 语句将使“外部”CATCH 块接收到有效的指针:

TRY{    TRY    {        // Do something to throw an exception.    }    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

Catch 块内部的 Try 块

不能从 CATCH 块内部的 try 块中再次引发当前异常。下列示例无效:

TRY{    // Do something to throw an exception.}CATCH(CException, e){    try    {        throw;  // Wrong.  Causes e (the exception                 // being thrown) to be deleted.    }    catch(CException exception)    {    }}END_CATCH