[讨论] 错误处理 exception assert log 选哪一种

楼主: StarTouching (抚星)   2014-05-17 11:48:07
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吧!
作者: kwpn (ITSST)   2014-05-17 13:22:00
assert跟其他不一样,是用在debug的,不太算是error handle
作者: diabloevagto (wi)   2014-05-17 13:43:00
http://ideone.com/ 程式用这个贴就好了
作者: a27417332 (等号卡比)   2014-05-17 15:01:00
之前我也是遇到类似的困扰XD但如果用例外的话,那么在控管资源的时候就得用RAII不然unwind的时候,有机会资源泄漏那类的样子@@然后assert是debug期的检查,log也只是把讯息存下来感觉不太算的上是错误处理。
作者: diabloevagto (wi)   2014-05-17 16:37:00
请问a大,exception 跟 RAII 的关系是?http://ppt.cc/G4au 是像这篇文章提到的 lock 问题
作者: HudsonE   2014-05-17 17:54:00
Exception 需要比较长的训练和正确的认知Error code 简单,只是 code 流程会参杂一堆无关的 if
作者: carylorrk (carylorrk)   2014-05-18 02:30:00
简单情况下, RAII 还是比 goto 麻烦一点。不过该处理的两个都要处理, RAII资源复杂时反而比较好懂
作者: a27417332 (等号卡比)   2014-05-18 15:52:00
使用RAII,例外发生时,在unwind的时候资源回收方便例外跟回传错误码这两个的使用好像一直都是战争XD
作者: littleshan (我要加入剑道社!)   2014-05-18 23:49:00
C++ 你还是得用 exception,除非你没有 ctor 或是 operator overload
作者: Killercat (杀人猫™)   2014-05-19 10:14:00
这三种其实是完全不同的用途 怎么会混在一起XD

Links booklink

Contact Us: admin [ a t ] ucptt.com