C++ 在库中处理错误的一种方法
2005-08-16 14:06
411 查看
处理错误, 特别是在library中, 一直是一件麻烦的事情.
library知道错误发生了, user知道如何处理这种错误, 但是问题是,
library的作者不知道 user 想如何处理错误的. 通过返回值, 抛异常, 直接abort?
一般来说, 抛异常是最常用的一种方法, 但是某些情况下并不合适. 例如当发生错误是可以预计的, 并不是一个"异常事件"时, 或者简单的就是不能使用异常.
一种更好的方式是, library将这个问题留给user, 让user自己决定错误发生时应该如何处理.也就是一种policy的设计.
例如;假设有一个class utility, 其中有一个run方法可能发生错误,
class utility
{
public:
void run()
{
if(...)
error(); //如何处理??
}
};
user 如何干预错误发生时的处理呢?
我们可以提供一个模板成员函数
template<class Handler>
void run( Handler h)
{
if(...)
h(); //调用用户提供的函数
}
或者给用户提供一个重载的函数版本提供默认的实现:
void default_error_handler()
{
throw "Ooops..";
}
void run()
{
//调用成员模板
run ( default_error_handler);
}
这样user的使用就可以:
try
{
utility u;
u.run(); //默认, 失败抛出异常
}
catch(const char * sz)
{
...
}
或者
void empty_error_handler()
{
}
utility u;
u.run( empty_error_handler ); //装糊涂
或者
struct set_error_flag
{
set_error_flag(bool* b)
: flags(b)
{
}
void operator()()
{
*flags_ = !(*flags_); //设置标志位
}
bool * flags_;
}
utility u;
bool err = false;
u.run( set_error_flag(&err)); //设置标志位
if(error)
{
// ......
}
甚至更多方式.
另外一种方式就是定义一个interface, 来几个虚函数.例如:
class error_handler
{
virtual void on_error() = 0;
};
这种方式基本上最是"纯OO"的, 也是"面向对象的", 在C++中也最不好用, 大部分情况下可以不须考虑这种方式.
library知道错误发生了, user知道如何处理这种错误, 但是问题是,
library的作者不知道 user 想如何处理错误的. 通过返回值, 抛异常, 直接abort?
一般来说, 抛异常是最常用的一种方法, 但是某些情况下并不合适. 例如当发生错误是可以预计的, 并不是一个"异常事件"时, 或者简单的就是不能使用异常.
一种更好的方式是, library将这个问题留给user, 让user自己决定错误发生时应该如何处理.也就是一种policy的设计.
例如;假设有一个class utility, 其中有一个run方法可能发生错误,
class utility
{
public:
void run()
{
if(...)
error(); //如何处理??
}
};
user 如何干预错误发生时的处理呢?
我们可以提供一个模板成员函数
template<class Handler>
void run( Handler h)
{
if(...)
h(); //调用用户提供的函数
}
或者给用户提供一个重载的函数版本提供默认的实现:
void default_error_handler()
{
throw "Ooops..";
}
void run()
{
//调用成员模板
run ( default_error_handler);
}
这样user的使用就可以:
try
{
utility u;
u.run(); //默认, 失败抛出异常
}
catch(const char * sz)
{
...
}
或者
void empty_error_handler()
{
}
utility u;
u.run( empty_error_handler ); //装糊涂
或者
struct set_error_flag
{
set_error_flag(bool* b)
: flags(b)
{
}
void operator()()
{
*flags_ = !(*flags_); //设置标志位
}
bool * flags_;
}
utility u;
bool err = false;
u.run( set_error_flag(&err)); //设置标志位
if(error)
{
// ......
}
甚至更多方式.
另外一种方式就是定义一个interface, 来几个虚函数.例如:
class error_handler
{
virtual void on_error() = 0;
};
这种方式基本上最是"纯OO"的, 也是"面向对象的", 在C++中也最不好用, 大部分情况下可以不须考虑这种方式.
相关文章推荐
- C++第六周任务一【任务1】下面的程序存在编译错误。有两种方法可以修改,请给出这两种修改方案,在报告中说明你倾向于用哪一种?为什么?处理此类问题的原则是什么?
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- VS2010 c++ 错误的处理方法
- VS2010 c++ 错误的处理方法
- VS2010 c++ 错误的处理方法 (不断更新....)
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- C++编译全攻略-编译器处理及LNK错误的解决方法(ZZ)
- [转贴]从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- JQuery 1.3.2以上版本中出现pareseerror错误的一种情况及处理方法
- C++中overflow错误处理方法
- 类语句.NET下编译C++代码时出现"error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int"错误的解决方法。
- ELMAH (ASP.NET错误日志处理)使用方法
- 查找错误的几个调试方法&一些C/C++的文章&一些零碎知识
- C++经典错误之already defined in *****.obj解决方法[转]
- Nginx常见错误及处理方法
- C与C++的错误处理
- SpringMVC中出现" 400 Bad Request "错误(用@ResponseBody处理ajax传过来的json数据转成bean)的解决方法
- 错误类型:Provider (0x80004005)未指定的错误 的一个处理方法