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++ 处理异常和错误的最佳做法