一、Win32错误

也就是Win32子系统产生的错误。当我们在自己的代码里调用Windows系统的API函数,系统执行API内部代码,当API内部代码出现错误,会将预先定义好的错误代码写到调用这个API的线程局部存储区域(这个区域是每个线程独有的其他线程无法更改。它存储着一些线程独有的东西),然后API返回,返回值告诉我们该API执行失败了。如果我们的代码加了检测,发现了API失败,这时我们调用GetLastError() 函数去获取这个错误代码,这个错误代码是一个DWORD值。如果我们不及时获取,就会被后面调用的API所覆盖。当我们想在自己的函数里借用这种机制时,可以调用SetLastError函数来设置一个错误代码。

这里我们提到了两个API:

  • DWORD GetLastError(VOID)
  • void SetLastError(DWORD dwErrCode)

二、Win32 Error Code

所有Win32错误代码都必须在0x0000到0xFFFF范围内,尽管Win32错误代码可以同时用于16位字段和32位字段,我们通常还是用32位来表示。大多数值已经定义了默认错误消息,可用于将值映射到我们可以读懂的文本消息。它的构成如下:

虽然win32子系统错误的位域有32bit,但受限于值的范围,也只能是0x00000000---0x0000FFF,也就是上面的位域高16bit都是0。

三、获取错误具体信息
通过前面的说明我们了解了错误代码的获取,以及错误代码和信息是怎么制作出来的,那么当我们用GetLastError获取到错误代码后,我们只是有了一个编号,还是不了解具体什么原因什么错误,这时,我们该用到另外一个函数了FormatMessage。

原型:

DWORD WINAPI FormatMessage (
                            DWORD dwFlags, // source and processing options
                            LPCVOID lpSource, // message source
                            DWORD dwMessageId, // message identifier
                            DWORD dwLanguageId, // language identifier
                            LPTSTR lpBuffer, // message buffer
                            DWORD nSize, // maximum size of message buffer
                            va_list *Arguments // array of message inserts
 
                            );
它的功能就是将GetLastError函数得到的错误信息(这个错误信息是数字代号)转化成字符串信息的函数。
四、总结
我们可以自定义错误代码和信息,通过SetLastError来实现我们自己的代码的错误处理机制,然后通过系统API或自定义函数的返回值,检测函数是否失败,若失败,通过GetLastError函数获取线程里当前的错误代码,在通过FormatMessage来查询错误信息,写到我们自己的日志里,来帮助我们调试程序的功能性和业务性问题。

最新文章

  1. Java职业生涯规划
  2. int and string
  3. Linux目录初识
  4. cass实体编码列表
  5. 成为JAVA软件开发工程师要学哪些东西
  6. 【JAVA】【NIO】5、Java NIO Scatter / Gather
  7. 换行符在ajax中返回json,eval时发生的 Unexpected token ILLEGAL
  8. POJ 3419 Difference Is Beautiful(RMQ+二分 或者 模拟)
  9. 列表生成式、生成器&迭代器
  10. notes for lxf(四)
  11. ubuntu16.04 安装java
  12. git使用方法----如何利用git管理代码?如何使用git将代码传到github中去
  13. Devexpress GridControl切换数据源
  14. Vue全局API总结
  15. ODOO v10.0 自动生成财务凭证的科目设置
  16. python 之@staticmethod和@classmethod
  17. 组件 -- Badge
  18. Java GC的原理
  19. 记c#中构造函数中this的用法
  20. H5测试 有空了解下里面没有用过的东西

热门文章

  1. linux maven 安装
  2. Python 获取本月的最后一天
  3. 2.NioEventLoop的创建
  4. harbor helm仓库使用
  5. WebApi接收接收日期格式参数时,日期类型(2019-10-08T16:00:00.000Z)后台接收时间少8小时问题
  6. webpack+vue搭建vue项目
  7. 能够提高PHP的性能的一些注意事项
  8. uavcan扩展帧格式 zubax
  9. 安装opencv出现的问题
  10. 【idea】scala&sbt+idea安装配置与测试