在多数情况下,windows API在发生错误时很少抛出异常,多数是通过函数返回值进行处理。(windows api中无返回值的函数很少。)

windows api错误处理通常按照以下方式:首先api函数返回特殊的值,表明函数内部发生错误;然后调用方可以使用GetLastError获得对应的错误码。

通常情况下windows api按照返回类型可以分为以下几类:

  • 返回值为BOOL类型。有错误发生,返回值为0,否则返回非零值。
  • 返回值为HANDLE类型。有错误发生时,返回NULL或INVALID_HANDLE_VALUE(值为-1)。
  • 返回值为LONG类型或DWORD类型。有错误发生时,返回0或-1。

由于windows api返回类型不太一致,所以在实际处理windows api错误时建议查看下msdn上对应的说明,并按照其中的解释处理对应的错误码。

  1. DWORD WINAPI GetLastError(void);

通过调用GetLastError函数返回的错误码是一个DWORD类型(32bit),其固定位域映射格式如下(按照windows下小端位顺序,从低位到高位依次编号0,1,…,30,31;注意下表中都是按照二进制数据表示的):

含义
bit30~31 安全级别,00=安全,01=信息,10=警告,11=错误
bit29 错误来源,0-Microsoft定义的,1-用户自定义错误码
bit28 保留位,必须是0
bit16~27

错误来源的工具码,Microsoft定义的(Winerror.h)

bit0~15

工具对应的状态码,Microsoft或用户定义。

如果需要的话,我们也可以自己定义错误码,并使用windows api类似的错误机制,具体可参考 SetLastError 、 SetLastErrorEx函数,但需要注意自定义的错误码不要跟windows错误码重复。

查看错误码对应的信息可以使用visual c++提供的错误查找工具(Error Lookup Tool),也可以直接在调试器的观察窗口中输入“@err, hr”。

当然也可以使用FormatMessage函数将错误码直接转化成对应的字符串。调用代码如下:

  1. // Windows错误码解析程序,ErrCodeParseDemo
  2. // 简单介绍如何将错误码转化为对应的字符串信息
  3. // 建议使用vs2005以上版本编译 unicode编码
  4. #include <windows.h>
  5. #include <iostream>
  6. #include <WinError.h>
  7. using std::wcout;
  8. using std::endl;
  9.  
  10. void OutputFormatMessage(DWORD errCode)
  11. {
  12. LPTSTR lpMsgBuf = NULL;
  13.  
  14. FormatMessage(
  15. FORMAT_MESSAGE_ALLOCATE_BUFFER |
  16. FORMAT_MESSAGE_FROM_SYSTEM |
  17. FORMAT_MESSAGE_IGNORE_INSERTS,
  18. NULL,
  19. errCode,
  20. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  21. (LPTSTR) &lpMsgBuf,
  22. , NULL );
  23.  
  24. wcout << "err:" << std::hex << errCode << " Msg tips:" << endl
  25. << lpMsgBuf << endl;
  26.  
  27. LocalFree(lpMsgBuf);
  28. }
  29.  
  30. int _tmain(int argc, _TCHAR* argv[])
  31. {
  32. // 输出中文
  33. std::wcout.imbue(std::locale("chs"));
  34.  
  35. // 设置控制台标题栏
  36. SetConsoleTitle(TEXT("ErrCodeParseDemo"));
  37.  
  38. OutputFormatMessage(ERROR_INVALID_FUNCTION);
  39.  
  40. OutputFormatMessage(ERROR_HANDLE_EOF);
  41.  
  42. return ;
  43. }

上述代码可从git@osc下载,链接如下:https://git.oschina.net/Tocy/SampleCode.git。位于ErrCodeParseDemo.cpp中。

Windows API 错误码的更多相关文章

  1. Windows下错误码全解析

    windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...

  2. 火币网API文档——REST API 错误码

    错误码 行情 API 错误码 错误码 描述 bad-request 错误请求 invalid-parameter 参数错 invalid-command 指令错 code 的具体解释, 参考对应的er ...

  3. Go 实现 自动检索 API 错误码代码行 并 打印成文档,例 markDown 形式等

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  4. Java服务器端 API 错误码设计总结

    1.对于API结果返回,定义BaseResult 类 拥有success,errorCode,errorMsg个3个基本参数,success使用Boolean类型,errorCode使用Integer ...

  5. API错误码设计-资料

    搜索到一篇文章:新浪微博API错误代码说明对照表 可以参考新浪微博的错误码设计思路,设计自己系统的错误码.

  6. 火币网API文档——WebSocket API错误码

    错误信息返回格式 { "id": "id generate by client", "status": "error", ...

  7. windows LARGE_INTEGER 错误码输出格式

    如果是负数,I32X 版权声明:本文为博主原创文章,未经博主允许不得转载.

  8. Windows错误码解析

    C或者C++开发肯定经常会遇到各种错误码,由于每个错误码只是一个枚举或者一个整形数值,调试或者输出日志的时候,无法知道这个错误码的具体含义,这时候就需要将此错误码解释出来.对于自己定义的错误码,可以通 ...

  9. socket学习及各类错误码(部分转)

    如果本地有多个网卡(即多个ip),要指定本地发送网卡,则在建立的socket上bind所指定的网卡进行connect和send操作.例子程序如下: #include <stdio.h>#i ...

随机推荐

  1. Swift3 获取当前连接WIFI名称

    1.导入库 import SystemConfiguration import SystemConfiguration.CaptiveNetwork 2.方法 /// 获取wifi名称 /// /// ...

  2. 聚集函数查询结果为空, list的size是1, resolve

    resultList.removeAll(Collections.singleton(null));

  3. 使用requests库实现多线程下载

    多线程下载主要用到http请求中的header Content-Length:资源长度,用于确认资源的总长度,从而便于规划每个线程的任务量 Range:bytes=beg1-end1;beg2-end ...

  4. linux shell 脚本攻略学习10--生成任意大小的文件和文本文件的交集与差集详解

    一.生成任意大小的文件(dd命令): 举例: amosli@amosli-pc:~/learn/example$ ; + records in + records out bytes ( MB/s a ...

  5. Eclipse自动部署项目到Tomcat的webapps下的有效方法

    开发JavaEE项目,常用的工具有MyEclipse,Eclipse,netBeans等,我比较喜欢用Eclipse,因为相比MyEclipse体积小很多,响应速度也快,且足以满足需求,我喜欢简洁的编 ...

  6. SQL plan directives

    SQL plan directives SQL plan directives含有优化器产生优化的执行计划时需要的附加信息和指令. 在sql执行时,如果cardinality估计有错误,数据库就会创建 ...

  7. Oracle VPD策略示例

    1.未创建前使用oe用户登录查询: SQL> select * from orders; ORDER_ID ORDER_DATE ORDER_MO CUSTOMER_ID ORDER_STATU ...

  8. rhel7 ifconfig command not found

    同事扔过来一个rhel7.2的系统,登录后发现没有安装ifconfig命令: # ifconfig -bash: ifconfig: command not found 先看看环境变量: # echo ...

  9. CentOS7 安装java 环境 摘抄

    转http://www.diyhi.com/hostConfig.html 服务器环境配置 下面介绍全新安装的CentOS系统服务器安装配置商城软件服务环境的方法.演示主机操作系统为CentOS 7. ...

  10. Python 爬虫实例(15) 爬取 百度百聘(微信公众号)

    今天闲的无聊,爬取了一个网站,百度百聘,仅供学习参考 直接上代码: #-*-coding:utf-8-*- from common.contest import * def spider(): hea ...