本文介绍 MFC 中提供的异常处理机制。 有两种机制可用:
C++例外,可在 MFC 版本 3.0 及更高版本中使用
MFC 异常宏,可在 MFC 版本 1.0 及更高版本中使用
如果要使用 MFC 编写新应用程序,则应使用C++机制。 如果现有应用程序已广泛使用该机制,则可以使用基于宏的机制。
你可以将现有代码转换为使用C++异常,而不是 MFC 异常宏。 “异常:从 MFC 异常宏转换”一文介绍了转换代码的优点和执行此作指南。
如果已使用 MFC 异常宏开发应用程序,则可以继续使用现有代码中的这些宏,同时在新代码中使用C++异常。 异常:版本 3.0 中异常宏的更改提供了执行此作的准则。
本文涵盖以下主题:
何时使用异常
在程序执行期间调用函数时,可能会出现三类结果:正常执行、错误执行或异常执行。 下面描述了每个类别。
正常执行
该函数可以正常执行并返回。 某些函数将结果代码返回到调用方,该代码指示函数的结果。 可能的结果代码是严格为函数定义的,并表示函数的可能结果范围。 结果代码可以指示成功或失败,甚至可以指示处于正常预期范围内的特定类型的失败。 例如,文件状态函数可以返回指示该文件不存在的代码。 请注意,不使用术语“错误代码”,因为结果代码表示许多预期结果之一。
错误执行
调用方在将参数传递给函数时犯了一些错误,或者在不适当的上下文中调用函数。 这种情况会导致错误,并且应在程序开发过程中由断言检测到。 (有关断言的详细信息,请参阅 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++异常关键字进行比较,并说明如何调整代码: