• Windows错误处理


    1.简介

    调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务,如果传入的参数无效,或者由于其他原因导致操作无法执行,则函数的返回值将指出函数的失败原因。以下为大多数Windows函数使用的返回值的数据类型。

    常见的返回值类型
    数据类型指出函数调用失败的值
    VOID这个函数不可能失败
    BOOL如果失败,返回0;否则,返回非0
    HANDLE

    如果失败,返回NULL;否则,HANDLE将标识一个可操纵的对象。

    注意:某些函数会返回INVALID_HANDLE_VALUE的一个句柄,它被定义为-1

    PVOID如果失败,返回NULL;否则,PVOID将标识一个数据块的内存地址
    LONG/DWORD返回计数的函数通常会返回一个LONG或DWORD,如果函数出于某种原因不能对我们想要计数的东西进行计数,它通常会返回0或-1。

    在内部,当Windows函数检测到错误时,它会使用一种名为“线程本地存储区”的机制将响应的错误代码与“主调线程”关联到一起,这种机制使不同的线程能够独立运行,不会出现相互干扰对方的错误代码的情况。

    2.GetLastError()方法

    此函数使用很简单,返回上一个函数调用设置的线程的32位错误代码。

    以下是在#include 头文件中,截取的一小部分。

    1. //
    2. // MessageId: ERROR_HANDLE_EOF
    3. //
    4. // MessageText:
    5. //
    6. // Reached the end of the file.
    7. //
    8. #define ERROR_HANDLE_EOF 38L
    9. //
    10. // MessageId: ERROR_HANDLE_DISK_FULL
    11. //
    12. // MessageText:
    13. //
    14. // The disk is full.
    15. //
    16. #define ERROR_HANDLE_DISK_FULL 39L

    可以看见每个错误有MessageId和MessageText。

    MessageId主要用于与GetLastError()的返回值做比较。

    Windows函数失败之后,应该马上调用GetLastError(),因为如果又调用了另一个函数,则此值会被改写。

    3.Visual Studio调试:查看上一个错误代码

    按F5调试的过程中,我们在watch窗口中选择一行,然后输入$err,hr。如下图所示:

    这里测试一个打开存在的文件,本地文件时不存在的。

     HANDLE hfile = CreateFile(TEXT("C:\\123"), 0, 0, NULL, OPEN_EXISTING, 0, NULL);

     查看错误,如下图所示:报错,找不到指定的文件。

    4.查看msg信息

    使用FormatMessage函数,可以获取到具体的错误信息。

    1. HANDLE hfile = CreateFile(TEXT("C:\\123"), 0, 0, NULL, OPEN_EXISTING, 0, NULL);
    2. DWORD dw = GetLastError();
    3. LPVOID msgBuf = NULL;
    4. FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,
    5. NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    6. (LPTSTR)&msgBuf,
    7. 0, NULL);
    8. PCTSTR msgStr = (PCTSTR)LocalLock(msgBuf);
    9. LocalFree(msgBuf);

  • 相关阅读:
    《洛谷深入浅出进阶篇》P3397 地毯————二维差分
    webpack5基于React+Antd搭建开发和生产环境
    查分小程序,教学大作用
    算法练习第六十四天
    20220921(信号量)
    vue Router
    渗透测试-信息收集DNSenum简介与常见参数
    C# winform chart 饼状图的使用布局
    队列模拟学习 C++
    每天分享一点运维小知识---pm2工具
  • 原文地址:https://blog.csdn.net/wzz953200463/article/details/126234735