您的位置:首页 > 其它

Windows开发笔记-错误处理

2015-11-08 15:35 483 查看
  Windows函数为开发者提供了错误代码,这样当调用Windows函数失败后,可以通过查看错误代码了解错误信息。相应的错误与主调线程关联在一起,这种机制使得不同的线程能够独立运行而不会相互干扰。调用GetLastError 查看错误代码。

  Windows提供的错误代码很多,相应的头文件是WinError.h。

  当调用Windows函数失败后,应当立即调用GetLastError来获取错误代码,因为每个线程维护一份错误代码,这个错误代码会随着函数调用而被更新。在Visual Studio中,通过在Watch中输入$err,hr显示错误代码和错误描述信息。如果在自己开发的应用程序中,需要向用户展示错误信息,那么可以用FormatMessage将错误代码转换成错误描述信息。生命如下

DWORD
WINAPI
FormatMessageW(
__in     DWORD dwFlags,
__in_opt LPCVOID lpSource,
__in     DWORD dwMessageId,
__in     DWORD dwLanguageId,
__out    LPWSTR lpBuffer,
__in     DWORD nSize,
__in_opt va_list *Arguments
);


  同时也可以自己定义错误代码,为了指出错误,只需设置线程的上一个错误代码,然后让自己的函数的返回FLASE,INVALID_HANDLE_VALUE,NULL的值,调用SetLastError传入自定义错误代码。这个错误代码的的制定也不是随便一个32位整数就可以,需要根据每一位的意义去设置。

  错误代码的不同字段

31-30      严重性  0: 成功   1 :信息  2:  警告   3:  错误

29           MS/客户    0 : MS    1 :  客户

28          保留       0

27-16     Facility    前256个值由MS保留

15-0       异常代码


  需要通过上述规则去编写错误代码。

#define ERROR_NOT_CHECKED              0x60000000
bool isChecked(bool checked)
{
if(!checked)
{
SetLastError(ERROR_NOT_CHECKED);
return false;
}
return true;
}
int main()
{

char * ch;
FILE *fp = fopen("aaa.txt","r");
if(!fp)
{
TCHAR  chstr[100]={0};
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox(NULL,(LPCWSTR)lpMsgBuf,NULL,MB_OK);
LocalFree( lpMsgBuf );
}
isChecked(false);
printf("%x\n",GetLastError());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: