本文介绍 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++异常关键字进行比较,并说明如何调整代码: