[討論] 錯誤處理 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