Windows 程序设计6:错误码的查看

文章目录

  • 前言
  • 一、说明
  • 二、使用GetLastError找到错误的原因
  • 三、使用错误码的宏
  • 总结


前言

Windows 程序设计6:错误码的查看。


一、说明

有时写的代码单纯看是没有问题的,但是执行起来就会崩溃。因此要养成判断函数执行是否成功的习惯,除非这个函数根本判断不了。比如void Init()这样的函数是可能没办法进行判断的,这种函数一般是肯定会保证执行成功的。如果是自己封装的函数或者系统提供的API函数有时就可以进行判断。

对于自己封装的函数或者系统提供的API函数,如果不能保证100%成功,一般都会通过返回值或者参数返回的形式来判断函数是否执行成功。

所以,我们在使用一个函数的时候,要对他执行后返回的状态进行判断,否则默认函数执行成功,程序继续往下执行的话,很有可能造成程序的崩溃,而且还找不到程序崩溃的问题。

二、使用GetLastError找到错误的原因

使用函数GetLastError找到执行的错误信息,函数原型

DWORD GetLastError(VOID);

没有参数,返回值是DWORD双字的整型,表示错误码的值。针对函数执行遇到的不同错误,GetLastError的返回值是不同的。其针对Windows系统提供的API函数,执行失败获取其错误码。获取调用线程的最后错误代码值,最后一个错误代码是基于每个线程维护的,多个线程不会覆盖彼此的最后错误代码。
利用https://editor.csdn.net/md/?articleId=145371197介绍的文件删除函数进行说明。如果目标路径没有要删除的文件,则就会报错。

此时在本机的D盘下已经没有名为111.gif的文件,这里要删除D盘下的111.gif文件

BOOL bret1 = DeleteFile(_T("D:\\111.gif"));
if (bret1)
{
	MessageBox(NULL, _T("删除成功"), _T("提示"), MB_OK);	
}
else
{
	MessageBox(NULL, _T("删除失败"), _T("提示"), MB_OK);
}

理论上来说,由于已经不存在该文件,由于程序语法正确,编译可以通过,但是该删除函数会报错。
在这里插入图片描述
即便我们清楚,函数执行失败的原因是没有目标文件要删除的文件,但是对于使用者来说,其不清楚为什么删除失败,那么就需要用到函数GetLastError。
下断点后运行,进入DeBug模式
在这里插入图片描述
可以看到错误码为2
在这里插入图片描述
但是根据这个错误码"2",我们并不知道具体是什么原因。在网上查询发现,错误码"2"表示找不到指定文件
在这里插入图片描述
实际上,这种错误码有很多,每个错误码表示的错误信息是不一样的,那么我们如何找到其对应信息?每次都上网查询很不方便。

微软为我们提供了一个工具,可以根据GetLastError返回的错误码找的其对应的错误信息。位置在vs编译器的工具->错误查找
在这里插入图片描述
输入2,点击查找,则显示系统找不到指定文件,与我们在网上找的结果相同
在这里插入图片描述
这说明由于指定路径并不存在该文件,因此系统找不到指定的文件,与我们预料的原因相同。
再试一下另一种情况,D盘下存在一个命名为111new.gif的文件,其为只读文件。
在这里插入图片描述
此时要删除该文件

BOOL bret1 = DeleteFile(_T("D:\\111new.gif"));
if (bret1)
{
	MessageBox(NULL, _T("删除成功"), _T("提示"), MB_OK);
}
else
{
	DWORD dwerror = GetLastError();
	MessageBox(NULL, _T("删除失败"), _T("提示"), MB_OK);
}

此时给出的错误码为5

在这里插入图片描述
查找发现对应的错误信息为拒绝访问。
在这里插入图片描述
这是由于只读文件造成的,如果将只读去掉,则程序可以正常删除文件。
在这里插入图片描述
删除成功
在这里插入图片描述
则可将代码改为

BOOL bret1 = DeleteFile(_T("D:\\111new.gif"));
if (bret1)
{
	MessageBox(NULL, _T("删除成功"), _T("提示"), MB_OK);
}
else
{
	DWORD dwerror = GetLastError();
	if (dwerror == 2)
	{
		MessageBox(NULL, _T("文件不在指定路径"), _T("提示"), MB_OK);
	}
	else
	{
		MessageBox(NULL, _T("删除失败"), _T("提示"), MB_OK);
	}
}

运行得到如下结果
在这里插入图片描述

三、使用错误码的宏

上文已经提到,错误码为2表示系统找不到指定的文件;错误码为5表示拒绝访问。但是错误码有上万个,不可能全都记住。而且错误码对应的数字随着微软系统的升级后期是有可能发生变化的,因此最好使用Windows提供给我们的错误码的宏,而不是使用数值。
利用关键字查找办法:Win32 Error Code
直接在搜索引擎中进行搜索,即可将错误码对应的错误原因列出,下面是部分错误码示例
ERROR_SUCCESS (0): 操作成功完成。

ERROR_INVALID_FUNCTION (1): 错误的函数。

ERROR_FILE_NOT_FOUND (2): 系统找不到指定的文件。

ERROR_PATH_NOT_FOUND (3): 系统找不到指定的路径。

ERROR_ACCESS_DENIED (5): 访问被拒绝。

ERROR_INVALID_HANDLE (6): 句柄无效。

ERROR_NOT_ENOUGH_MEMORY (8): 存储空间不足,无法处理此命令。

ERROR_BAD_FORMAT (11): 试图加载格式错误的程序。

ERROR_INVALID_ACCESS (12): 访问代码无效。

ERROR_INVALID_DATA (13): 数据无效。

ERROR_OUTOFMEMORY (14): 存储空间不足,无法完成此操作。

ERROR_INVALID_DRIVE (15): 系统找不到指定的驱动器。

ERROR_NO_MORE_FILES (18): 没有更多文件。

ERROR_WRITE_PROTECT (19): 介质受写入保护。

ERROR_BAD_UNIT (20): 系统无法找到指定的设备。

ERROR_NOT_READY (21): 设备未就绪。

ERROR_BAD_COMMAND (22): 设备不识别的命令。

ERROR_CRC (23): 数据错误(循环冗余检查)。

ERROR_BAD_LENGTH (24): 程序发出命令,但命令长度不正确。

ERROR_SEEK (25): 驱动器无法找到磁盘上的特定区域或磁道。

ERROR_NOT_DOS_DISK (26): 无法访问指定的磁盘或软盘。

ERROR_SECTOR_NOT_FOUND (27): 驱动器找不到请求的扇区。

ERROR_WRITE_FAULT (29): 系统无法写入指定的设备。

ERROR_READ_FAULT (30): 系统无法从指定的设备读取。

ERROR_GEN_FAILURE (31): 附加到系统的设备无法正常工作。

那么最好将程序中的错误码数字变为宏,这里将错误码2改为对应的宏即可。

if (dwerror == ERROR_FILE_NOT_FOUND)

同时也可以看到该宏与错误码2对应
在这里插入图片描述
需要说明。在DeleteFile等函数调用成功后,也可以调用GetLastError,此时返回的错误码为0,即操作成功完成。
在这里插入图片描述

总结

Windows 程序设计6:错误码的查看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/961629.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器

一、高级定时器简介 高级定时器的简介在前面一章已经介绍过,可以点击下面链接了解,在这里进行一些补充。 [STM32 - 野火] - - - 固件库学习笔记 - - -十二.基本定时器 1.1 功能简介 1、高级定时器可以向上/向下/两边计数,还独有一个重复计…

安装zsh并美化

0 Zsh 是一种功能强大的 shell,通常用于替代默认的 Bash shell。它为命令行提供了更多的功能,例如自动补全、强大的模式匹配和主题支持等。 Oh My Zsh 是用于管理 Zsh 配置的框架。 powerlevel10k是样式,通过p10k configure脚本可以调节自己…

Hive:复杂数据类型之Map函数

Map函数 是Hive里面的一种复杂数据类型, 用于存储键值对集合。Map中的键和值可以是基础类型或复合类型,这使得Map在处理需要关联存储信息的数据时非常有用。 定义map时,需声明2个属性: key 和 value , map中是 key value 组成一个元素 key-value, key必须为原始类…

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理

WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…

Sklearn 中的逻辑回归

逻辑回归的数学模型 基本模型 逻辑回归主要用于处理二分类问题。二分类问题对于模型的输出包含 0 和 1,是一个不连续的值。分类问题的结果一般不能由线性函数求出。这里就需要一个特别的函数来求解,这里引入一个新的函数 Sigmoid 函数,也成…

【Rust自学】14.6. 安装二进制crate

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 14.6.1. 从cratea.io安装二进制crate 通过cargo_install命令可以从crates.io安装二进制crate。 这并不是为了替换系统包,它应…

Vue 组件开发:构建高效可复用的前端界面要素

1 引言 在现代 Web 开发中,构建高效且可复用的前端界面要素是提升开发效率和用户体验的关键。Vue.js 作为一种轻量级且功能强大的前端框架,提供了丰富的工具和机制,帮助开发者快速构建高质量的应用程序。通过合理设计和封装 Vue 组件,我们可以实现组件的高效复用,提高开发…

Qt Ribbon使用实例

采用SARibbon创建简单的ribbon界面 实例代码如下所示&#xff1a; 1、头文件&#xff1a; #pragma once #include <SARibbonBar.h> #include "SARibbonMainWindow.h" class QTextEdit; class SAProjectDemo1 : public SARibbonMainWindow { Q_OBJECT pub…

微服务入门(go)

微服务入门&#xff08;go&#xff09; 和单体服务对比&#xff1a;里面的服务仅仅用于某个特定的业务 一、领域驱动设计&#xff08;DDD&#xff09; 基本概念 领域和子域 领域&#xff1a;有范围的界限&#xff08;边界&#xff09; 子域&#xff1a;划分的小范围 核心域…

【Unity3D】实现2D角色/怪物死亡消散粒子效果

核心&#xff1a;这是一个Unity粒子系统自带的一种功能&#xff0c;可将粒子生成控制在一个Texture图片网格范围内&#xff0c;并且粒子颜色会自动采样图片的像素点颜色&#xff0c;之后则是粒子编辑出消散效果。 Particle System1物体&#xff08;爆发式随机速度扩散10000个粒…

AAAI2024论文解读|HGPROMPT Bridging Homogeneous and Heterogeneous Graphs

论文标题 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning 跨同构异构图的小样本提示学习 论文链接 HGPROMPT: Bridging Homogeneous and Heterogeneous Graphs for Few-shot Prompt Learning论文下载 论文作者 Xingtong Yu, Yuan…

密码学的数学基础1-整数 素数 和 RSA加密

数学公式推导是密码学的基础, 故开一个新的课题 – 密码学的数学基础系列 素数 / 质数 质数又称素数。 一个大于1的自然数&#xff0c;除了1和它自身外&#xff0c;不能被其他自然数整除的数叫做质数&#xff1b;否则称为合数&#xff08;规定1既不是质数也不是合数&#xff0…

使用CSS实现一个加载的进度条

文章目录 使用CSS实现一个加载的进度条一、引言二、步骤一&#xff1a;HTML结构与CSS基础样式1、HTML结构2、CSS基础样式 三、步骤二&#xff1a;添加动画效果1、使用CSS动画2、结合JavaScript控制动画 四、使用示例五、总结 使用CSS实现一个加载的进度条 一、引言 在现代网页…

Oracle 创建用户和表空间

Oracle 创建用户和表空间 使用sys 账户登录 建立临时表空间 --建立临时表空间 CREATE TEMPORARY TABLESPACE TEMP_POS --创建名为TEMP_POS的临时表空间 TEMPFILE /oracle/oradata/POS/TEMP_POS.DBF -- 临时文件 SIZE 50M -- 其初始大小为50M AUTOEXTEND ON -- 支持…

图漾相机——C++语言属性设置

文章目录 前言1.SDK API功能介绍1.1 Device组件下的API测试1.1.1 相机工作模式设置&#xff08;TY_TRIGGER_PARAM_EX&#xff09;1.1.2 TY_INT_FRAME_PER_TRIGGER1.1.3 TY_INT_PACKET_DELAY1.1.4 TY_INT_PACKET_SIZE1.1.5 TY_BOOL_GVSP_RESEND1.1.6 TY_BOOL_TRIGGER_OUT_IO1.1.…

NoSQL与SQL比较

1.认识NoSQL NoSql可以翻译做Not Only Sql&#xff08;不仅仅是SQL&#xff09;&#xff0c;或者是No Sql&#xff08;非Sql的&#xff09;数据库。是相对于传统关系型数据库而言&#xff0c;有很大差异的一种特殊的数据库&#xff0c;因此也称之为非关系型数据库。 1.1.结构…

【Unity教程】零基础带你从小白到超神part3

粒子系统 在创建粒子系统之前&#xff0c;需要先添加一些粒子样式&#xff0c;这可以在资源商店中通过导入官方提供的StandardAssets资源包得到。完成资源的导入后&#xff0c;该资源包中的StandardAssets>ParticleSystems>Prefabs文件夹下包含多种成品粒子效果&#xf…

FastExcel使用详解

文章目录 FastExcel使用详解一、引言二、环境准备与依赖引入1、Maven 依赖引入2、实体类定义 三、核心操作&#xff1a;读写 Excel1、读取 Excel1.1 自定义监听器1.2 读取文件 2、写入 Excel2.1 简单写入2.2 模板写入 四、Spring Boot 集成示例1、文件上传&#xff08;导入&…

智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力

摘要&#xff1a;随着全球化和数字化进程的加速&#xff0c;消费者需求日益呈现出碎片化和个性化的趋势&#xff0c;这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求&#xff0c;因此&#xff0c;物流企业必须积极引入大…

数据结构与算法分析:专题内容——人工智能中的寻路4之A*搜索(代码详解)

一、算法描述 广度优先搜索能够找到一个最优解&#xff08;如果存在&#xff09;&#xff0c;但是可能需要访问大量的节点&#xff0c;因为我们可以看到&#xff0c;它并没有尝试对候选走法进行排序。相反&#xff0c;深度优先搜索却是尽可能多地向前探测路径&#xff0c;不过…