Windows开发笔记-错误处理
2015-11-08 15:35
483 查看
Windows函数为开发者提供了错误代码,这样当调用Windows函数失败后,可以通过查看错误代码了解错误信息。相应的错误与主调线程关联在一起,这种机制使得不同的线程能够独立运行而不会相互干扰。调用GetLastError 查看错误代码。
Windows提供的错误代码很多,相应的头文件是WinError.h。
当调用Windows函数失败后,应当立即调用GetLastError来获取错误代码,因为每个线程维护一份错误代码,这个错误代码会随着函数调用而被更新。在Visual Studio中,通过在Watch中输入$err,hr显示错误代码和错误描述信息。如果在自己开发的应用程序中,需要向用户展示错误信息,那么可以用FormatMessage将错误代码转换成错误描述信息。生命如下
同时也可以自己定义错误代码,为了指出错误,只需设置线程的上一个错误代码,然后让自己的函数的返回FLASE,INVALID_HANDLE_VALUE,NULL的值,调用SetLastError传入自定义错误代码。这个错误代码的的制定也不是随便一个32位整数就可以,需要根据每一位的意义去设置。
错误代码的不同字段
需要通过上述规则去编写错误代码。
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; }
相关文章推荐
- 跳台阶
- Android Activity与Service的交互方式
- 安装OpenBlas (ubuntu 14.04)
- CodeForces 445B DZY Loves Chemistry (并查集)
- 数据库面试题目经典大全
- CodeForces 445B DZY Loves Chemistry (并查集)
- 20135203齐岳 信息安全系统设计基础第九周学习总结
- poj 2318 TOYS (计算几何)
- 选择>努力
- jquery实现简易的移动端验证表单
- HDU 2064 二分图 匈牙利算法 零基本教学
- Tomcat之——添加CROS跨源请求
- nginx和lua开发二
- Android中常用对话框
- spring的bean配置文件中p:
- 解决Mysql乱码问题
- REM实战
- linux命令-vim命令模式
- [HDOJ4081]Qin Shi Huang's National Road System
- 【Java高级】反射+工厂模式+属性文件的实例应用