MFC 中的异常处理

本文说明 MFC 中可用的异常处理机制。 有两种机制可用:

  • C++ 异常,在 MFC 版本 3.0 及更高版本中可用

  • MFC 异常宏,在 MFC 版本 1.0 及更高版本中可用

如果要使用 MFC 编写新应用程序,则应使用 C++ 机制。 如果现有应用程序已广泛使用基于宏的机制,则可以使用该机制。

可以轻松地将现有代码转换为使用 C++ 异常,而不是 MFC 异常宏。 转换代码的优点和有关如何执行此操作的准则在异常:从 MFC 异常宏转换一文中进行了介绍。

如果已使用 MFC 异常宏开发了应用程序,则可以继续在现有代码中使用这些宏,同时在新代码中使用 C++ 异常。 异常:3.0 版本中异常宏的修改一文提供了有关执行此操作的准则。

注意

若要在代码中启用 C++ 异常处理,请在项目属性页对话框的 C/C++ 文件夹中的“代码生成”页上选择“启用 C++ 异常”,或使用 /EHsc 编译器选项。

本文涵盖以下主题:

何时使用异常

在程序执行期间调用函数时,可能会出现三种类别的结果:正常执行、错误执行或异常执行。 下面介绍了每种类别。

  • 正常执行

    函数可以正常执行并返回。 某些函数会将指示函数结果的结果代码返回给调用方。 可能的结果代码为函数严格定义,表示函数的可能结果范围。 结果代码可以指示成功或失败,甚至可以指示处于正常预期范围内的特定类型的失败。 例如,文件状态函数可以返回指示文件不存在的代码。 请注意,未使用术语“错误代码”,因为结果代码表示许多预期结果之一。

  • 错误执行

    调用方在将参数传递给函数时犯错,或是在不适当的上下文中调用函数。 这种情况会导致错误,应在程序开发期间由断言检测到。 (有关断言的详细信息,请参阅 C/C++ 断言。)

  • 异常执行

    异常执行包括程序控制之外的条件(如内存不足或 I/O 错误)影响函数结果的情况。 异常情况应通过捕获并引发异常来处理。

使用异常特别适合于异常执行。

MFC 异常支持

无论是直接使用 C++ 异常还是使用 MFC 异常宏,都会使用可能由框架或应用程序引发的 CException 类CException派生对象。

下表显示了 MFC 提供的预定义异常。

Exception 类 含义
CMemoryException 类 内存不足
CFileException 类 文件异常
CArchiveException 类 存档/序列化异常
CNotSupportedException 类 响应对不支持的服务的请求
CResourceException 类 Windows 资源分配异常
CDaoException 类 数据库异常(DAO 类)
CDBException 类 数据库异常(ODBC 类)
COleException 类 OLE 异常
COleDispatchException 类 调度(自动化)异常
CUserException 类 通过消息框警告用户,然后引发泛型 CException 类的异常

自 3.0 版开始,MFC 已使用 C++ 异常,但仍支持其较早的异常处理宏,这些宏在形式上与 C++ 异常类似。 虽然建议不要将这些宏用于新编程,但仍可使用它们实现向后兼容。 在已使用宏的程序中,你也可以随意使用 C++ 异常。 从 Visual C++ 2.0 版开始,在预处理期间,宏的计算结果为 C++ 语言的 MSVC 实现中定义的异常处理关键字。 当你开始使用 C++ 异常时,可以保留现有异常宏。 有关混合使用宏和 C++ 异常处理以及转换旧代码以使用新机制的信息,请参阅文章异常:使用 MFC 宏和 C++ 异常异常:从 MFC 异常宏转换。 较早的 MFC 异常宏(如果你仍在使用它们)的计算结果为 C++ 异常关键字。 请参阅异常:3.0 版本中异常宏的修改。 MFC 不直接支持 Windows NT 结构化异常处理程序 (SEH),如结构化异常处理中所述。

有关异常的其他阅读材料

以下文章介绍如何使用 MFC 库进行异常处理:

以下文章将 MFC 异常宏与 C++ 异常关键字进行比较,并说明如何调整代码:

另请参阅

现代 C++ 处理异常和错误的最佳做法