Error handling大致有以下几种方式
1. 丢出例外 请呼叫的人掌握状况
2. assert
("Exceptions address the robustness of your application while assertions
address its correctness"
出处: http://stackoverflow.com/a/1957656/1992731 )
3. 写error log
4. return一个值 请呼叫的人自己处理
5. 测资可以过就好 可以跟Boss交差就好 (误)
例如C的fopen会回传NULL表示开档失败
而.NET C++的System::IO::File::Open则是使用exception 且分门别类很仔细
各有优缺点 但我就是比较拿捏不到何时该用哪种error handling。
手边刚好有一个我觉得算不错的例子:
利用strtol实作字串转整数 有error handling
#include <iostream>
#include <cerrno>
#include <cstring>
using namespace std;
class Atoi{
protected:
long mVal;
public:
enum Error{
// ....
};
protected:
Error mErrFlag;
public:
Atoi(char* _s){
char *_end;
errno=0;
mVal = strtol(_s,&_end,10);
/* Error Handling
1. _s是不是有非数字格式的内容 ( *_end != '\0'? )
2. _s是不是超出long的范围 ( errno == ERANGE? )
*/
}
/* member functions: 回传各整数型态*/
/* Error Handling: 判断mVal是否在特定整数型态范围内。判断后才回传*/
operator int() const;
inline enum Error getErrorFlag() const {return mErrFlag;}
};
int main()
{
char *s = "10000"; // 舍弃的c style用法 在此仅为简明
//int i = Atoi(s);
//cout << Atoi(s).operator short() << endl;
return 0;
}
这个例子有三种例外可以处理。
手边没有compiler的人可以用这个网站:
http://www.compileonline.com/compile_cpp11_online.php
以上宣告仅供参考
不一定每种都会用到 例如errFlag是在使用方法4:请呼叫者自行判断时才会用到
也不一定是最好的方式。
我想请问各位高手
在什么情况你们选会选择哪种/哪些错误处理方案呢?
PS. 虽然VC 32-bit app的try-catch会降低效能 不过gcc4.x+和VC 64-bit采用
zero cost exception 所以我想就还是可以用exception吧!