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