COM组件设计与应用(十二)——错误与异常处理2009-12-25杨老师一、前言程序设计中,错误处理必不可少,而且通常要占用很大的篇幅。本回书着落在 COM 中的错误(异常)的处理方法。在组件程序中,如果遇到错误,一般有两个方式进行处理。二、简单返回对于比较简单的错误,直接返回表示错误原因的 HRESULT。比如下面几个就是常见的错误值:
E_INVALIDARG | 0x80070057 | 参数错误 |
E_OUTOFMEMORY | 0x8007000E | 内存错误 |
E_NOTIMPL | 0x80004001 | 未实现 |
E_POINTER | 0x80004003 | 无效指针 |
E_HANDLE | 0x80070006 | 无效句柄 |
E_ABORT | 0x80004004 | 终止操作 |
E_ACCESSDENIED | 0x80070005 | 拒绝访问 |
E_NOINTERFACE | 0x80004002 | 不支持接口 |
另外,你还可以返回自己构造 HRESULT 错误值。方法是使用宏 MAKE_HRESULT(sev,fac,code)
参数 | 含义 | 值(二进制) |
sev 严重程度 | 成功 | 00 |
成功,但有一些报告信息 | 01 |
警告 | 10 |
错误 | 11 |
fac 设备信息 | FACILITY_AAF | 00000010010 |
FACILITY_ACS | 00000010100 |
FACILITY_BACKGROUNDCOPY | 00000100000 |
FACILITY_CERT | 00000001011 |
FACILITY_COMPLUS | 00000010001 |
FACILITY_CONFIGURATION | 00000100001 |
FACILITY_CONTROL | 00000001010 |
FACILITY_DISPATCH | 00000000010 |
FACILITY_DPLAY | 00000010101 |
FACILITY_HTTP | 00000011001 |
FACILITY_INTERNET | 00000001100 |
FACILITY_ITF | 00000000100 |
FACILITY_MEDIASERVER | 00000001101 |
FACILITY_MSMQ | 00000001110 |
FACILITY_NULL | 00000000000 |
FACILITY_RPC | 00000000001 |
FACILITY_SCARD | 00000010000 |
FACILITY_SECURITY | 00000001001 |
FACILITY_SETUPAPI | 00000001111 |
FACILITY_SSPI | 00000001001 |
FACILITY_STORAGE | 00000000011 |
FACILITY_SXS | 00000010111 |
FACILITY_UMI | 00000010110 |
FACILITY_URT | 00000010011 |
FACILITY_WIN32 | 00000000111 |
FACILITY_WINDOWS | 00000001000 |
FACILITY_WINDOWS_CE | 00000011000 |
code 唯一错误码 | 16位(bit) 你自己定义去吧 | |
调用者得到返回的 HRESULT 值后,也可以使用宏 HRESULT_SEVERITY()、HRESULT_FACILITY()、HRESULT_CODE() 来取得sev错误程度、fac设备信息和 code 错误代码。