zoukankan      html  css  js  c++  java
  • Windows开发笔记-错误处理

      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 ",GetLastError()); return 0; }
  • 相关阅读:
    Linux_文件权限
    离殇
    Oracle数据库软件标准版的一个限制:仅仅能用一个rman channel
    数据结构和算法设计专题之---推断两个链表是否相交并找出交点
    Test for Job (poj 3249 记忆化搜索)
    表达式求值
    HDOJ 2196 Computer 树的直径
    ListView的position的保持
    Django訪问量和页面PV数统计
    【oracle 11G Grid 】Crsctl start cluster 和 crsctl start crs 有差别么?
  • 原文地址:https://www.cnblogs.com/techdreaming/p/4947431.html
Copyright © 2011-2022 走看看