Windows程序设计 - 错误处理

本文探讨了Windows程序设计中如何利用内置错误处理函数如GetLastError和FormatMessage,以及如何定义和理解Windows错误码结构,包括严重性、客户代码和设施代码的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个系列是本人基于对比Linux程序设计的同时一并学习Windows的程序设计,在开始程序设计之前,我们第一件事情就是查看Windows是如何处理错误的,方便我们后续继续开展Windows程序设计的学习

目录

前言

定义属于我们自己的错误码

Reference

前言

第一件事情,我们使用的就是Windows提供的SDK,常见的函数的返回的数据类型有

  • VOID(不可能失败的函数,很少有函数的返回类型是VOID)

  • BOOL(函数失败返回0,反之返回的是一个非0的值,一个好的办法是检查这个函数的返回值是不是False来断言他是否失败!)

  • PVOID(函数调用失败返回NULL,否则会标识一块内存)

  • LONG/DWORD,这类函数请查看具体的SDK说明!

一个好的办法就是立马查看GetLastError返回最近的一次错误!

DWORD GetLastError();

有些令人难受的是:Windows的函数是首字母大写的,我们没办法依靠字母大小写断定他可能的类型

在WinError.h中,存在定义错误码的文件:近7w行的大文件!

//
// MessageId: ERROR_INVALID_FUNCTION
//
// MessageText:
//
// Incorrect function.
//
#define ERROR_INVALID_FUNCTION           1L    // dderror
​
//
// MessageId: ERROR_FILE_NOT_FOUND
//
// MessageText:
//
// The system cannot find the file specified.
//
#define ERROR_FILE_NOT_FOUND             2L
// ...

可以看到,每一个错误有三种标识:

  1. 消息ID(在源代码上使用的宏)

  2. 消息文本(描述错误)

  3. 一个标号(不必理会这个,不建议使用这个)

当我们调用GetLastError函数,返回的总是错误码,直接扔给用户看错误码多少不太友好,

DWORD FormatMessage(
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpSource,
  [in]           DWORD   dwMessageId,
  [in]           DWORD   dwLanguageId,
  [out]          LPTSTR  lpBuffer,
  [in]           DWORD   nSize,
  [in, optional] va_list *Arguments
);

可以使用这个函数得到错误描述字符串。

定义属于我们自己的错误码

我们可以定义自己的错误码!很简单

VOID SetLastError(DWORD dwErrCode);

DWORD是一个32位的值,来看看你应该如何排布他!

//
// Note: There is a slightly modified layout for HRESULT values below,
//        after the heading "COM Error Codes".
//
// Search for "**** Available SYSTEM error codes ****" to find where to
// insert new error codes
//
//  Values are 32 bit values laid out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +---+-+-+-----------------------+-------------------------------+
//  |Sev|C|R|     Facility          |               Code            |
//  +---+-+-+-----------------------+-------------------------------+
//
//  where
//
//      Sev - is the severity code
//
//          00 - Success
//          01 - Informational
//          10 - Warning
//          11 - Error
//
//      C - is the Customer code flag
//
//      R - is a reserved bit
//
//      Facility - is the facility code
//
//      Code - is the facility's status code
//
//
// Define the facility codes
//
31-30292827-1615-0
内容严重性Microsoft/客户保留Facility代码异常代码
含义0 成功 1 信息(提示) 2 警告 3 错误0:Microsoft定义 1:客户自定义0前256个值被Microsoft保留定义的代码

Reference

GetLastError 函数 (errhandlingapi.h) - Win32 apps | Microsoft Learn

FormatMessage 函数 (winbase.h) - Win32 apps | Microsoft Learn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值