[討論] 錯誤處理 exception assert log 選哪一種
看板C_and_CPP (C/C++)作者StarTouching (撫星)時間12年前 (2014/05/17 11:48)推噓3(3推 0噓 15→)留言18則, 7人參與討論串1/2 (看更多)
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吧!
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.162.193.163
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400298490.A.674.html
→
05/17 13:22, , 1F
05/17 13:22, 1F
→
05/17 13:43, , 2F
05/17 13:43, 2F
→
05/17 15:01, , 3F
05/17 15:01, 3F
→
05/17 15:04, , 4F
05/17 15:04, 4F
→
05/17 15:04, , 5F
05/17 15:04, 5F
→
05/17 15:09, , 6F
05/17 15:09, 6F
→
05/17 15:10, , 7F
05/17 15:10, 7F
→
05/17 16:37, , 8F
05/17 16:37, 8F
→
05/17 16:40, , 9F
05/17 16:40, 9F
推
05/17 17:54, , 10F
05/17 17:54, 10F
→
05/17 17:55, , 11F
05/17 17:55, 11F
→
05/18 02:30, , 12F
05/18 02:30, 12F
→
05/18 02:32, , 13F
05/18 02:32, 13F
→
05/18 15:52, , 14F
05/18 15:52, 14F
→
05/18 15:53, , 15F
05/18 15:53, 15F
推
05/18 23:49, , 16F
05/18 23:49, 16F
→
05/18 23:50, , 17F
05/18 23:50, 17F
推
05/19 10:14, , 18F
05/19 10:14, 18F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章