异常:从 MFC 异常宏转换

这是一个高级主题。

本文说明如何转换现有代码编写使用 Microsoft 基础类 - 宏 TRYCATCHTHROW,等使用异常处理关键字 trycatch和 throw的 C++。 主题包括:

  • 转换优点

  • 转换与异常宏使用 C++ 异常的代码

转换的优点

您可能不需要转换现有代码,所以,虽然您应该知道在宏实现在 MFC 3.0 版及实现之间的差异。早期版本。 这些差异和后续更改。代码行为在 异常:指向异常宏在版本 3.0 中的更改讨论。

转换的主要优点是:

  • 代码使用异常处理关键字的 C++ 编译为一个稍微小的 .EXE 或 .DLL。

  • 异常处理关键字的 C++ 更通用的:可以处理这些属性可以复制任意数据类型的异常 (int、浮动,char,依此类推),则宏,而只需要处理异常从其派生的类和 CException 类。

当异常超出范围时,宏和关键字之间的主要差异在于该代码使用宏“自动”删除所捕获的异常。 使用关键字的代码不,因此,必须显式删除所捕获的异常。 有关更多信息,请参见知识库文章 异常:捕获异常和删除

另一不同之处是语法。 宏和关键字的语法在三个方面不同:

  1. 宏的参数和异常声明:

    CATCH 宏调用具有以下语法:

    CATCH( exception_class,*exception_object_pointer_name *###)

    请注意是类名和名称对象指针间的逗号。

    catch 关键字的异常声明使用此语法:

    catch( exception_type exception_name###)

    此异常声明语句指示异常类型的 catch 块中处理。

  2. Catch 块中的一个:

    宏,CATCH 宏 (带有参数) 开始第一个 Catch 块;AND_CATCH 宏开始后续 catch 块,catch 块,END_CATCH 宏终止序列。

    关键字,catch 关键字 (使用的异常声明) 开始每个 catch 块。 没有复制为 END_CATCH 宏;catch 块的右大括号。结束

  3. 引发表达式:

    宏使用 THROW_LAST 重新引发当前异常。 throw 关键字,而参数,这具有同样的效果。

执行转换。

转换代码使用宏使用的 C++ 异常处理关键字

  1. 查找 MFC 宏 TRYCATCHAND_CATCHEND_CATCHTHROWTHROW_LAST的所有匹配项。

  2. 替换或删除以下宏的所有匹配项:

    TRY (请用 try替换它。)

    CATCH (请用 catch替换它。)

    AND_CATCH (用 catch替换它。)

    END_CATCH (其删除。)

    THROW (用 throw替换它。)

    THROW_LAST (将 throw替换为该)

  3. 修改的参数,以便形成有效的异常声明。

    例如,若要更改

    CATCH(CException, e)
    

    设置为

    catch(CException* e)
    
  4. 修改在执行 catch 块中的代码,以便根据需要删除异常对象。 有关更多信息,请参见知识库文章 异常:捕获异常和删除

使用 MFC 宏异常,这是异常处理代码的示例。 请注意,因为在下面示例中的代码使用宏,将引发异常 e 自动删除:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

在下一示例中的代码使用了 C++ 异常关键字,因此,必须显式删除异常:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

有关更多信息,请参见 异常:使用 MFC 宏和 C++ 异常

请参见

概念

MFC 中的异常处理