[討論] 錯誤處理 exception assert log 選哪一種

看板C_and_CPP (C/C++)作者 (撫星)時間12年前 (2014/05/17 11:48), 編輯推噓3(3015)
留言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
assert跟其他不一樣,是用在debug的,不太算是error handle
05/17 13:22, 1F

05/17 13:43, , 2F
http://ideone.com/ 程式用這個貼就好了
05/17 13:43, 2F

05/17 15:01, , 3F
之前我也是遇到類似的困擾XD
05/17 15:01, 3F

05/17 15:04, , 4F
但如果用例外的話,那麼在控管資源的時候就得用RAII
05/17 15:04, 4F

05/17 15:04, , 5F
不然unwind的時候,有機會資源洩漏那類的樣子@@
05/17 15:04, 5F

05/17 15:09, , 6F
然後assert是debug期的檢查,log也只是把訊息存下來
05/17 15:09, 6F

05/17 15:10, , 7F
感覺不太算的上是錯誤處理。
05/17 15:10, 7F

05/17 16:37, , 8F
請問a大,exception 跟 RAII 的關係是?
05/17 16:37, 8F

05/17 16:40, , 9F
http://ppt.cc/G4au 是像這篇文章提到的 lock 問題
05/17 16:40, 9F

05/17 17:54, , 10F
Exception 需要比較長的訓練和正確的認知
05/17 17:54, 10F

05/17 17:55, , 11F
Error code 簡單,只是 code 流程會參雜一堆無關的 if
05/17 17:55, 11F

05/18 02:30, , 12F
簡單情況下, RAII 還是比 goto 麻煩一點。
05/18 02:30, 12F

05/18 02:32, , 13F
不過該處理的兩個都要處理, RAII資源複雜時反而比較好懂
05/18 02:32, 13F

05/18 15:52, , 14F
使用RAII,例外發生時,在unwind的時候資源回收方便
05/18 15:52, 14F

05/18 15:53, , 15F
例外跟回傳錯誤碼這兩個的使用好像一直都是戰爭XD
05/18 15:53, 15F

05/18 23:49, , 16F
C++ 你還是得用 exception,除非你沒有 ctor 或是 oper
05/18 23:49, 16F

05/18 23:50, , 17F
ator overload
05/18 23:50, 17F

05/19 10:14, , 18F
這三種其實是完全不同的用途 怎麼會混在一起XD
05/19 10:14, 18F
文章代碼(AID): #1JTjlwPq (C_and_CPP)
文章代碼(AID): #1JTjlwPq (C_and_CPP)