错误处理的一些想法

错误处理在编程中是很重要的,可以在调试,发布的时候少了很多麻烦,以往在做软件的时候总是少了错误处理,导致用户用来莫名其妙,在查找问题的时候也是没有头绪

最近在总结一些错误处理技巧,总共有这么一些方法:

1.LOG

log在关键的时刻可以救命的东西,因此我一直提议组里的人多使用log,但是log记多了也不好,会导致混杂信息太多

之前公司里面有个3D的写log太频繁,结果导致运行8小时就写了4G的log导致运行崩溃,当时给他找了好多天才发现是log的问题

先阶段来说,我们的log主要是用在处理输入输出上面,因此我建议在以下几个地方记录log:

1.1  与外部库最近交互的地方

这里的外部库就是非本公司所使用的开发库,比如我们公司使用的BOOST, QT这些库

1.2.     IO输入输出的数据

主要是网络,文件,串口这些信息,记录信息的时候除了有一份二进制的原始数据以外,最好还附带一份可视化的数据

1.3. 逻辑处理的地方

这个就比较难以界定了,其实到现在我没法很好地记录这方面的数据,但是我的建议是,如果这个逻辑处理是和外部交互的,比如网络,串口,一定要把这个逻辑给记录下来

2.错误值返回

错误值返回是比较古老的方式,好处程序是按照流程来处理的,坏处就是在if内嵌if的时候代码看起来会很杂乱,不过有do..while(false)这个技巧可以避免

3.异常处理

异常处理在C++里面是比较争议的一种方式,最近在项目里面我也开始使用异常处理,所以感慨比较多,但是给我的感觉就是这个不是用在错误处理的,之前看C++之父写的那本书的时候,他也提到过这一点,他是在处理异常而不是来处理错误的,很多C++的书都告诉用户异常处理是代替C语言方式的返回值的,但是C++之父强调了两点:

1.异常处理是用来处理异常的,这些异常需要是可恢复的

2.异常处理是用来解决构造函数无法报告错误的

但是怎么界定错误和异常这个我到现在还是没法好好地界定

之前书上很多都也都不建议使用异常,因为C++里面没有GC,但是我们可以使用RAII以及BOOST_EXIT和shared_ptr(其实也是RAII)来解决问题

因为好像在现代C++里面,好像没什么理由再不使用异常了

在之前用python的时候,python大部分都是利用异常来处理错误,python使用异常处理,我一直觉得这种方法不错,但是python本身的异常类型也有点多,如果要在C++里面模仿这种方法,我们必须要定义很多异常类型,否则无法把足够的异常信息带给外部,但是这样会造成的文件依赖

比如最近我在写一个函数,这个需要将一个格式的文件转换成对应的数据存储到SQL里面,需要做如下动作:

在每一个动作的时候,如果发生错误,我们都需要报告给外部知道发生了什么错误,以便于用户去处理

1.读取源文件

1.1 文件不存在

2.读取对应的数据

1.1 文件格式错误,或者缺少数据

3.根据对应的数据去读取对应的图片

1.1 图片不存在,或者图片格式错误

4.创建对应的sql文件

1.1 sql文件本身已经存在,需要询问用户究竟是代替掉还是取消这个行为??

5.创建对应的表

1.1 创建表错误

6.将对应的数据存储到sql文件

1.1 执行一些sql语句发生错误,或者读取对应的图片的时候发生错误,询问用户是要无视这个错误还是要继续执行

如果在函数内发生错误将会有如下的处理方式:

1.直接返回false,这种类型是无法继续执行的 (1,2,5)

2.需要询问用户是否继续执行(3,4)

最早的第一个版本我是使用异常的,但是后来发现,无法去询问用户是否继续执行

然后我改用bool,无法让外部知道是哪一步出错了,如果要让用户知道哪一步错误,需要定义一堆的enum,而且也无法让外部去询问

最后我的解决方案是:

把每一个动作封装成一个函数,然后在UI层分成每一步执行,这样可以达到上面的效果,但是无法将动作封装成一个函数

4.coroutine

这个是那天晚上想到的,是为了解决要寻外上面的例子里面需要询问外部的,在执行函数的时候传入一个coroutine,这样如果发生错误则暂停执行,返回到外部,由外部来决定是否继续执行

时间: 2024-11-09 12:59:26

错误处理的一些想法的相关文章

csu 1987: 绚丽的手链

1987: 绚丽的手链 Submit Page   Summary   Time Limit: 6 Sec     Memory Limit: 512 Mb     Submitted: 13     Solved: 2 Description 小X的妹妹马上就要过生日了,作为哥哥,小X打算买一些手链送给妹妹. 采购完礼物回到家的小X惊奇的发现:每条手链虽然只由两种颜色的珠子串成,但是它们有一个神奇的效果,那就是当多条手链同时放在一起时,会散发出绚丽夺目的光芒.光芒的绚丽程度有强有弱,这取决于手

Nubia Z5S(高通公司MSM8974) QHSUSB_BULK砖的方法节省模式(随着win7在恢复recovery分区案例)

Nubia Z5S在某些异常情况或按组合键进入QHSUSB_BULK状态, 这种模式的现象, 猜想windows(实例win7)即使在数据线, 它会出现在计算机n载,甚至会提示要格式化某些分区(这里要强调的是千万不要格式化不论什么分区,否则可能会变成真砖仅仅有返厂了) 关于这个模式能够參考我之前发的一篇文章: http://blog.csdn.net/syhost/article/details/20435957 上面文章中也提到, QHSUSB_BULK模式实际是在sbl分区中实现的, 只是纯

管理学定律十:罗森塔尔效应与虚假同感偏差

1.罗森塔尔效应 1.1 来源 由美国著名心理学家罗森塔尔和雅格布森在小学教学上予以验证提出,暗示在本质上,人的情感和观念会不同程度地受到别人下意识的影响.人们会不自觉地接受自己喜欢.钦佩.信任和崇拜的人的影响和暗示. "罗森塔尔效应"产生于美国著名心理学家罗森塔尔的一次有名的实验中:他和助手来到一所小学,声称要进行一个"未来发展趋势测验",并煞有介事地以赞赏的口吻,将一份"最有发展前途者"的名单交给了校长和相关教师,极为认真地说:"这

Nubia Z5S(高通MSM8974) QHSUSB_BULK模式救砖方法(以win7下恢复recovery分区为例)

Nubia Z5S在某种异常或者按组合按键的情况下会进入QHSUSB_BULK模式, 此种模式的现象是, 如果在windows(比如win7)下连上数据线, 则会在电脑出现n多分区挂载,甚至会提示要格式化某些分区(这里要强调的是千万不要格式化任何分区,否则可能会变成真砖只有返厂了) 关于这个模式可以参考我之前发的一篇文章: http://blog.csdn.net/syhost/article/details/20435957 上面文章中也提到, QHSUSB_BULK模式实际是在sbl分区中实

QT4工程转换为QT5工程方法

1.  #include <QtGui/QApplication> ---> No such file or directory 问题的解决 (原因是Qt5源文件位置的改动)1).pro文件中,在 QT       += core gui 下面一行添加greaterThan(QT_MAJOR_VERSION, 4): QT += widgets2)在mian.cpp文件中将#include <QtGui/QApplication>修改为 #include <QAppli

关于Linux系统basename函数缺陷的思考

某模块作为前台进程独立运行时,运行命令携带命令行参数:作为某平台下守护进程子进程运行时,需要将命令行参数固化在代码里.类似如下写法: char *argv[] = {"./DslDriver", "-t", "/bin/VdslModemSco.bin"}; int argc = sizeof(argv) / sizeof(argv[0]); 随后,调用basename函数(头文件为libgen.h)解析argv[0],即"./DslD

构建之法阅读笔记(一)

学习软件工程这门课程已经有5周了,通过这五周的学习.实验.以及阅读我对软件工程这门课程有了一定的了解.下面就通过对<构建之法>这本书的阅读过程来记录下我最近的感受. 通过课余时间的阅读,<构建之法>这本书我已读完前4章,通过对这四章的阅读,除了对软件工程的基本概念的了解外,我认为我收获最大的就是对软件工程师在公司的定位以及发展有了很大的认识.软件工程就是把系统的,有序的,可量化的方法应用到软件开发,运营和维护上的过程.软件工程包括软件需求分析,软件设计,软件构件,软件测试,和软件维

微软不也是从Altair Basic这丑小鸭长成白天鹅吗?

微软不也是从Altair Basic这丑小鸭长成白天鹅吗? February 2015 如果你想要弄清楚初创企业是怎么一回事的话,其中一个非常有价值的尝试是去研究下那些获得巨大成功的公司,去分析下为什么在这些巨头最初创业时期现在往回看其实并没有当初看上去的那么蹩脚.事实上,就算是现在的这些巨头,它们在刚开始创业的时候看上都是很蹩脚的,小且蹩脚.看上去更像是在学步的婴儿,且学步迈进的方向不像是后来它们已经证明的是往成功的高峰迈进,更多的是像是在跌跌撞撞的往一个万劫不复的泥潭前进. 作为Basic语

post 传递参数中包含 html 代码解决办法,js加密,.net解密

今天遇到一个问题,就是用post方式传递参数,程序在vs中完美调试,但是在iis中,就无法运行了,显示传递的参数获取不到,报错了,查看浏览器请求情况,错误500,服务器内部错误,当时第一想法是接收方式有问题,换了无数次接收方式,都没有效,后来在请求情况的,Response中发现,其实根本原因是由于post参数中不能包含html代码,设计到跨域攻击...,所以被禁止了. 微软给出的建议是 ASP.NET Web窗体中禁用请求验证 ,我是没成功,后来我查到其实可以用在前端用js base64加密,后