C++的另一种错误处理策略
作者:网络转载 发布时间:[ 2015/8/31 13:40:12 ] 推荐标签:开发语言 测试开发技术
这篇短文是讨论一个大多数程序员都感兴趣的一个话题:错误处理。错误处理是编程的一个“黑暗面”。它既是应用程序的“现实世界”的关键点,也是一个你想隐藏的复杂业务。
在早期的C编程生涯中,我知道三种错误处理的方式。
C语言的方式:返回错误码
C语言风格的错误处理是简单的,但是并不完美。
C语言风格的错误处理依赖于“当程序遇到错误时返回一个错误码”。这里是一个简单的例子:
int find_slash(const char *str)
{
int i = 0;
while (str[i] && str[i] != '/')
i++;
if (str[i] == '')
return -1;
//Error code
//True value
return i;
}
// . . .
if (find_slash(string) == -1)
{
//error handling
}
使用这种方式的有什么好处?
你可以在调用函数之后直接处理错误码(在C语言中,你也会这样处理),显示一个错误消息或者直接终止程序。或者仅仅恢复程序近的一个状态,终止计算。
当你找不到错误处理在哪里的时候,你只需要后头看看函数调用,错误处理在那个附近。
使用这种方式有什么不好?
有人可能会告诉你,这种异常/错误处理方式和“执行逻辑”混在了一起。当你顺序地阅读这些代码的时候行程序执行一样,你看到了一会错误处理,一会程序执行。这样很糟糕,你可能更喜欢只读程序执行逻辑或者错误处理逻辑。
并且你被限定使用错误码,如果你想要提供更多的信息,你需要创建一些功能函数比如:errstr或者提供全局变量。
使用C++的方式
C++作为对C的增强,引入了一种新的错误处理方式——异常。异常通过抛出一个错误的方式来中断正常代码执行逻辑,并可以被其他地方所捕获。下面是一个简单的例子:
int find_slash(const char *str)
{
int i = 0;
while (str[i] && str[i] != '/')
i++;
if (str[i] == '')
throw AnException("Error message");
//True value
return i;
}
// . . .
try
{
find_slash(string);
}
catch(AnException& e)
{
//Handle exception
}
这样做的好处?
程序逻辑和错误处理分离了。一边你可以看到函数是如何工作的,而另一边你可以看到函数失败时候是怎么处理的。这样做很完美,可以很容易看出错误处理和正常程序逻辑。
另外,现在你可以为你的错误提供你需要的尽可能多的信息,因为你可以将需要的内容填充在自定义异常对象里。
这样做的坏处
编写详尽的异常处理变得很冗。你需要一个异常树,但是好不要太大,这样,你可以选择捕获感兴趣的异常。同时,内部需要提供错误码,来获知究竟发生了什么,同时需要检索一些错误消息,等等。编写写异常类通常都是冗长,这是将信息嵌入到错误里来灵活处理更多的信息的成本。
这里的错误处理哲学是将错误尽可能推迟到需要处理的地方再处理,当你不知道程序执行过程究竟哪里会产生一个错误,你需要跳过不同的文件和功能函数来查找,这通常都是困难的,如果你在一个很深的调用树(这里意思是当你将函数调用绘制出一个图形,其形状类似一棵树)上引发了一个异常,你需要指定在哪里来处理这个异常,当它被处理的时候,它又是在哪里发生的。特别是当你的程序很大,又是很早之前编写,有恰巧设计不够良好的时候,更加显得困难。而大多数商业项目都是这样。
所以我觉得“异常是危险的”。虽然它提供了一种良好的方式来处理错误——于一些小项目,并且这里的调用图简单且易于掌握时候。
相关推荐

更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11