Win32 Error
2024-08-22 06:52:46
一、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
来查询错误信息,写到我们自己的日志里,来帮助我们调试程序的功能性和业务性问题。最新文章
- Java职业生涯规划
- int and string
- Linux目录初识
- cass实体编码列表
- 成为JAVA软件开发工程师要学哪些东西
- 【JAVA】【NIO】5、Java NIO Scatter / Gather
- 换行符在ajax中返回json,eval时发生的 Unexpected token ILLEGAL
- POJ 3419 Difference Is Beautiful(RMQ+二分 或者 模拟)
- 列表生成式、生成器&;迭代器
- notes for lxf(四)
- ubuntu16.04 安装java
- git使用方法----如何利用git管理代码?如何使用git将代码传到github中去
- Devexpress GridControl切换数据源
- Vue全局API总结
- ODOO v10.0 自动生成财务凭证的科目设置
- python 之@staticmethod和@classmethod
- 组件 -- Badge
- Java GC的原理
- 记c#中构造函数中this的用法
- H5测试 有空了解下里面没有用过的东西