在多数情况下,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上对应的说明,并按照其中的解释处理对应的错误码。

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函数将错误码直接转化成对应的字符串。调用代码如下:

// Windows错误码解析程序,ErrCodeParseDemo
// 简单介绍如何将错误码转化为对应的字符串信息
// 建议使用vs2005以上版本编译 unicode编码
#include <windows.h>
#include <iostream>
#include <WinError.h>
using std::wcout;
using std::endl; void OutputFormatMessage(DWORD errCode)
{
LPTSTR lpMsgBuf = NULL; FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
errCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
, NULL ); wcout << "err:" << std::hex << errCode << " Msg tips:" << endl
<< lpMsgBuf << endl; LocalFree(lpMsgBuf);
} int _tmain(int argc, _TCHAR* argv[])
{
// 输出中文
std::wcout.imbue(std::locale("chs")); // 设置控制台标题栏
SetConsoleTitle(TEXT("ErrCodeParseDemo")); OutputFormatMessage(ERROR_INVALID_FUNCTION); OutputFormatMessage(ERROR_HANDLE_EOF); return ;
}

上述代码可从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 CADisplayLink简单用法

    1.定义属性 var displayLinkTimer:CADisplayLink? = nil 2.init displayLinkTimer = CADisplayLink(target: sel ...

  2. spring hiberante 集成出现异常 java.lang.ClassNotFoundException: org.hibernate.engine.SessionFactoryImplementor

    出现如题的异常是由于hibernate和spring集成时的的版本不一致所导致. 如下面,所示,如果你用的hibneate 4.0及以上版本,那么将会报错,因为这里用的事务管理是hibernate 3 ...

  3. at com.mysql.jdbc.SQLError.createSQLException

    WARN run, com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1de6191 -- APPARENT DEA ...

  4. 【LeetCode】217. Contains Duplicate (2 solutions)

    Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your funct ...

  5. Soapui groovy 加载外部property文件

    proFile = "c:\\test.properties" log.info proFile props = new java.util.Properties() props. ...

  6. git学习笔记(一)—— git环境搭建

    一.简介 Git是目前世界上最先进的分布式版本控制系统(没有之一). 首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库 ...

  7. SDL操作笔记

    原文地址:https://blog.csdn.net/qq_38124598/article/details/73543184 这里总结一下个人对SDL的一些函数,方便以后查询.   v1.0.1 1 ...

  8. Swift 基本运算符

    前言 Swift 语言支持大部分标准 C 语言的运算符,并且改进了许多特性来使我们的代码更加规范,其中主要包含算数运算符.区间运算符.逻辑运算符.关系运算符.赋值运算符.自增自减运算符.溢出运算符等. ...

  9. root目录空间不够的问题

    今天导入mysql表的时候,提示write file error /tmp/xxx 原因是表太大,创建临时表的时候,tmp目录不够空间了. 找到一个解决方法: 使用 mount --bind moun ...

  10. alibaba fastjson TypeReference 通过字符串反射返回对象

    TypeReferenceEditNew Page温绍 edited this page Nov 3, 2017 · 8 revisions1. 基础使用在fastjson中提供了一个用于处理泛型反序 ...