Windows开发笔记-错误处理
Windows函数为开发者提供了错误代码,这样当调用Windows函数失败后,可以通过查看错误代码了解错误信息。相应的错误与主调线程关联在一起,这种机制使得不同的线程能够独立运行而不会相互干扰。调用GetLastError 查看错误代码。
Windows提供的错误代码很多,相应的头文件是WinError.h。
当调用Windows函数失败后,应当立即调用GetLastError来获取错误代码,因为每个线程维护一份错误代码,这个错误代码会随着函数调用而被更新。在Visual Studio中,通过在Watch中输入$err,hr显示错误代码和错误描述信息。如果在自己开发的应用程序中,需要向用户展示错误信息,那么可以用FormatMessage将错误代码转换成错误描述信息。生命如下
DWORD
WINAPI
FormatMessageW(
__in DWORD dwFlags,
__in_opt LPCVOID lpSource,
__in DWORD dwMessageId,
__in DWORD dwLanguageId,
__out LPWSTR lpBuffer,
__in DWORD nSize,
__in_opt va_list *Arguments
);
同时也可以自己定义错误代码,为了指出错误,只需设置线程的上一个错误代码,然后让自己的函数的返回FLASE,INVALID_HANDLE_VALUE,NULL的值,调用SetLastError传入自定义错误代码。这个错误代码的的制定也不是随便一个32位整数就可以,需要根据每一位的意义去设置。
错误代码的不同字段
- 严重性 : 成功 :信息 : 警告 : 错误 MS/客户 : MS : 客户 保留 - Facility 前256个值由MS保留 - 异常代码
需要通过上述规则去编写错误代码。
#define ERROR_NOT_CHECKED 0x60000000
bool isChecked(bool checked)
{
if(!checked)
{
SetLastError(ERROR_NOT_CHECKED);
return false;
}
return true;
}
int main()
{ char * ch;
FILE *fp = fopen("aaa.txt","r");
if(!fp)
{
TCHAR chstr[]={};
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
,
NULL
);
MessageBox(NULL,(LPCWSTR)lpMsgBuf,NULL,MB_OK);
LocalFree( lpMsgBuf );
}
isChecked(false);
printf("%x\n",GetLastError());
return ;
}
Windows开发笔记-错误处理的更多相关文章
- Windows Internals 笔记——错误处理
1.Windows函数检测到错误时,会使用一种名为“线程本地存储区”的机制将相应的错误代码与“主调线程”关联到一起.这种机制使得不同的线程能独立运行,不会出现相互干扰对方的错误代码的情况. 2.Get ...
- iOS开发笔记错误集
错误类型列举 错误类型A:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 错误类型B:EXC_BREAKPOINT (code=EXC_A ...
- 菜鸟手下的iOS开发笔记(swift)
在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...
- Windows 8.1 store app 开发笔记
原文:Windows 8.1 store app 开发笔记 零.简介 一切都要从博彦之星比赛说起.今年比赛的主题是使用Bing API(主要提到的有Bing Map API.Bing Translat ...
- 开发客户端软件时,出现System.Windows.Markup.XamlParseException错误
开发客户端软件时,出现System.Windows.Markup.XamlParseException错误,通过查看错误消息,发现TCPIP的一个COM组件在安装软件过程中被删除了,重新注册了一下TC ...
- [开发笔记]-控制Windows Service服务运行
用代码实现动态控制Service服务运行状态. 效果图: 代码: #region 启动服务 /// <summary> /// 启动服务 /// </summary> /// ...
- Java开发笔记(七十四)内存溢出的两种错误
前面介绍的几种异常,其实都存在这样那样的逻辑问题,属于程序员的编码手误.还有一大类系统错误,表面上看不出什么问题,但是程序仍然运行不下去,兹举二例说明.第一个例子且看下列的测试代码: // 测试内存溢 ...
- FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建
前言 本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8. FFmpeg简介 FFmpeg是领先的多媒体框架,能够解码 ...
- zlib开发笔记(四):zlib库介绍、编译windows vs2015x64版本和工程模板
前言 Qt使用一些压缩解压功能,介绍过libzip库编译,本篇说明zlib库.需要用到zlib的msvc2015x64版本,编译一下. 版本编译引导 zlib在windows上的mingw32 ...
随机推荐
- Ionic 应用图标,信息修改
Ionic 应用图标,信息修改 Ionic 应用图标 修改 准备好替换的图标并生成各个尺寸的图标 1.使用命令行进入项目根目录,执行命令ionic resources 替换的图片放在resources ...
- 关于Latex中插入Visio图片文字不显示的问题
经过探索,将Visio保存为pdf格式是最完美的解决方式,因为pdf文件保存了所有格式和字体信息. Visio输出pdf时要使其符合PDF/A标准.如果包含Visio的多余信息,就会在一些低版本Lat ...
- angular自动化测试--protractor
前戏 面向模型编程: 测试驱动开发: 先保障交互逻辑,再调整细节.---by 雪狼. 为什么要自动化测试? 1,提高产出质量. 2,减少重构时的痛.反正我最近重构多了,痛苦经历多了. 3,便于新人接手 ...
- Linux 安装依赖库
###安装依赖库###yum -y install rsync net-snmp syslog net-snmp-devel wget patch screen gcc gcc-c++ autocon ...
- hasOwnProperty的用法
判断一个属性倒底是在原型中,还是在实例中 hasOwnProperty() 来个栗子 function Person(){ }; Person.prototype.name = "hezhi ...
- rownumber和rowid伪劣用法
select rownum ,deptno,dname loc from dept; select deptno,dname,loc from dept where rownum=1; select ...
- Oracle DECODE函数的用法详解
Oracle DECODE函数使用方法: 1.比较大小select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值sign()函数根据某个值是0. ...
- java多线程系列(一)
java多线程技能 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于<java多线程核心技术>与<java并发编程实战>等相关资料,希望站在巨人的肩膀上,再通过我 ...
- Java负载均衡-輪詢法
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.Set; /* ...
- Spring源码情操陶冶-AbstractApplicationContext#registerBeanPostProcessors
承接前文Spring源码情操陶冶-AbstractApplicationContext#invokeBeanFactoryPostProcessors 瞧瞧官方注释 /** * Instantiate ...