文章内容
1.定义自己的错误代码
2.ErrorShow示例程序
在深入讨论Windows提供的诸多特性之前,应该先理解各个Windows函数是如何进行错误处理的。
调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将支出函数因为某些原因失败了。下表展示了大多数Windows函数使用的返回值的数据类型。
数据类型 指出函数调用失败的值
—————————————————————————————————————
VOID 这个函数不可能失败。只有极少数Windows函数的返回值类型为VOID
—————————————————————————————————————
BOOL 如果函数失败,返回值为0;否则,返回值是一个非0值。应避免测试返
回值是否为TRUE,最稳妥的方法是检查它是否不为FALSE
—————————————————————————————————————
HANDLE 如果函数失败,则返回值通常为NULL;否则,HANDLE将标识一个可以操作
的对象。请注意这种返回值,因为某些函数会返回INVALID_HANDLE_VALUE
的一个句柄值,它被定义成-1.函数Platform SDK文档清楚说明了函数是返
回NULL还是INVALID_HANDLE_VALUE来标识失败
—————————————————————————————————————
PVOID 如果函数调用失败,则返回值为NULL。否则,PVOID将标识一个数据块的
内存地址
—————————————————————————————————————
LONG/DWORD 这种类型比较棘手。返回计数的函数通常会返回LONG或DWORD。如果函
数出于某种原因不能对我们想要技术的东西进行计数,它通常会返回0
或者-1。
—————————————————————————————————————
Microsoft编辑了一个一个列表,其中列出了所有可能的错误代码,并为每个错误代码都分配一个32位的编号。
函数返回时,如果发生错误,要查看具体是什么错误,情调用GetLastError函数,如下所示:
DWORD GetLastError();
此函数可以返回一个32位错误码,有了32位错误码,接着需要把它转化成为更有用的信息。Windows提供了一个函数,可以将错误代码转换成为相应的文本描述,此函数为FormatMessage,声明如下:
DWORD FormatMessage(
DWORD dwFlags,
LPCVOID lpSource,
DWORD dwMessageId,
DWORD dwLanguageId,
LPSTR lpBuffer,
DWORD nSize,
va_list *Arguments
);
自己定义自己的错误代码
我们会尽量使用WinError.h中现有的代码,只要代码能很好地反应我们想报告的错误。如果WinError.h中的任何一个代码都不能准确反映一个错误,就可以创建自己的代码。错误代码是一个32位数
位 31-30 29 28 27-16 15-0
-----------------------------------------------------------------------
内容 严重性 Microsoft/客户 保留 Facility代码 异常代码
----------------------------------------------------------------------
含义 0 = 成功 0 = Microsoft 必须为0 前256个值由 Microsoft/
1 = 信息(提示) 定义的代码 Microsoft保留 客户的代码
2 = 警告 1 = 客户定义的
3 = 错误 代码
ErrorShow示例程序
DWORD dwError;
//获得错误编码
dwError = GetDlgItemInt(IDC_EDIT_ERRORCODE,NULL,FALSE);
HLOCAL hlocal = NULL;
BOOL fOK = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS |
FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL,dwError,0,
(PTSTR)&hlocal,0,NULL);
if (fOK && (hlocal != NULL))
{
SetDlgItemText(IDC_EDIT_ERRORTEXT,(PCTSTR)LocalLock(hlocal));
LocalFree(hlocal);
}
else
{
SetDlgItemText(IDC_EDIT_ERRORTEXT,TEXT("No Text Found for this ERROR number."));
}