NT570 特價中
透過學習 .NET 框架的核心成為一位更好的 .NET開發人員
從這 1.5 小時的課程,你會學到
✅ 深入瞭解 .NET 的核心: CLR 中的物件終結( Object finalization )、 C# 中的結構佈局、例外處理過濾器( Exception filters ) 還有更多
✅ CLR 中的託管指標( Managed pointers ): C# 中的 ref 關鍵字及其在高效能編碼中的作用,ref 回傳和 ref local,Span
✅ CoreCLR 的核心
✅ Finalizers
✅ Destructor vs. Finalizer
I✅ Disposable vs. Finalizer
https://softnshare.com/csharp-and-dotnet-advanced-topics/
同時也有3部Youtube影片,追蹤數超過4萬的網紅吳老師教學部落格,也在其Youtube影片中提到,JAVA物件導向程式設計課程上課影音(10) 完整影音: http://www.youtube.com/playlist?list=PLsE34duTsJQwCh30WfQP5XVNMt1ngR3Ue 論壇: https://groups.google.com/forum/?hl=zh-TW#!f...
「c++例外處理」的推薦目錄:
- 關於c++例外處理 在 軟體開發學習資訊分享 Facebook 的最佳解答
- 關於c++例外處理 在 紀老師程式教學網 Facebook 的最佳貼文
- 關於c++例外處理 在 紀老師程式教學網 Facebook 的最佳解答
- 關於c++例外處理 在 吳老師教學部落格 Youtube 的最佳貼文
- 關於c++例外處理 在 吳老師教學部落格 Youtube 的精選貼文
- 關於c++例外處理 在 吳老師教學部落格 Youtube 的精選貼文
- 關於c++例外處理 在 [心得] R 的例外處理- 看板R_Language - 批踢踢實業坊 的評價
- 關於c++例外處理 在 C++ exception 例外處理 的評價
- 關於c++例外處理 在 C++程式語言第十三章13-1 C++的異常例外Exception處理 ... 的評價
- 關於c++例外處理 在 Join - Facebook 的評價
- 關於c++例外處理 在 [問題] 什麼樣的"錯誤"該用例外處理 - PTT 熱門文章Hito 的評價
- 關於c++例外處理 在 關於例外處理(Exception) 的評價
- 關於c++例外處理 在 [問題] 什麼樣的"錯誤"該用例外處理- C_and_CPP | PTT Web 的評價
c++例外處理 在 紀老師程式教學網 Facebook 的最佳貼文
[熱門文章] 程式設計、重構、與其它任何東西的終極問答
"The Ultimate Question of Programming, Refactoring, and Everything"
網頁版: http://goo.gl/6jIcIp
PDF 版: https://yadi.sk/i/pBZqebxsr5Wyg
#Craftmanships #SoftwareEngineering #CPP #Refactoring #ProgrammingSkills
好的!遲交比不交好,今天的推薦文來了(笑)~
今天介紹這篇,是過去一個禮拜在國外鄉民聚集地 Reddit 程式設計版瘋傳的文章。標題很臭屁「The Ultimate Question of Programming, Refactoring, and Everything」(沒錯!我就在意它最後一個字 "Everything"。咬我啊! XD)。因為轉載的人實在太多,讓我不禁努力地把它看完了。
其實這篇文章講的是 C/C++ 程式寫作者應該注意、或建議遵守的 42 個小訣竅。既不「Ultimate(終極)」,也不是涵蓋「Everthing」。不過裡面還是有不少中肯的建議,所以我還是將它介紹給大家。
為了讓英文苦手的朋友也能稍微感受一下這篇文章在講什麼,所以我不負責任地快速翻譯了每個標題一下。如果對哪個主題有興趣的,就麻煩大家直接對照標題號碼去看原文解說。原文有些標題用「戲謔」或「隱晦」寫法,我若直接翻譯,大家可能不知道原作者想表達什麼。所以我會將某些標題,用比較易懂的中文重新表達。一切以「標題編號(1~42)」為準。
接下來就請享用我這個不負責任的翻譯了。有會錯原文意思的,還請各位留言在下方、然後鞭小力一點 XD。我會馬上修正的:
1. 不要去做編譯器會做的事情
如:用迴圈能存取 a[0] ~ a[9],就不要用「拷貝貼上」a[0], a[1], a[2]..., a[9] 來存取裡面的內容值。
2. 大於 0 不代表它等於 1
若文件告訴你某函數執行成功會傳回「大於0」的值、但目前這個大於0的值是「1」。請你寫程式的時候不要自作聰明地偵測「傳回值 == 1」當成成功,請乖乖遵照規格書用「傳回值 > 0」等於成功。因為將來的版本有可能還會傳回 2, 3...等其他值。
3. 當你拷貝貼上一段程式碼,記得檢查它的副本兩遍
有時候你拷貝貼上一段程式碼,會忘了去修改裡面一些不同的小數字,導致花了大把時間去檢查錯誤到底出現在哪裡。
4. 小心使用「? :」運算子。並記得多加括號
「? :」是 C/C++ 內常用的運算子。若您寫了一段這樣的原始碼「a - b?0:1」,您可能以為它是這樣運作的「a - (b?0:1)」,事實上,它是這樣運作的「(a-b)?0:1」。結論是,多加括號保平安。
5. 多用市面上有的工具來分析您的原始碼
市面上有些工具,如:原始碼靜態分析工具、原始碼排列工具...可以幫您在把原始碼送入編譯器前,就抓到錯誤。不過作者也提到,別以為倚賴這些工具,錯誤就不會發生。真正要減少錯誤還是得靠多讀規格書,增加程式寫作經驗才辦得到。
6. 確認您所有的指標,都已經轉型成整數型態
作者擔心,某些使用 64 bits 當成指標變數寬度的系統,到 32 bits 的機器內重新編譯時,會產生高位元組被截斷的慘劇。某些編譯器提供「uintptr_t」這個專門給指標變數使用的型態,會隨著編譯器所在的環境,自動調整指標寬度。
7. 別在迴圈內呼叫「alloca()」這個函數
萬一迴圈失控,alloca() 函數會霸佔大量記憶體無法釋放。建議事先在迴圈外霸佔一大塊足夠的記憶體,然後在迴圈內慢慢蠶食之。
8. 在「解構函數(Destructor)」內使用「例外處理(Exception)」是很危險的!
作者認為,在負責釋放記憶體、收尾等工作的解構函數,還去霸佔新記憶體作事情是不好的。若真的發生例外(Exception),直接「吃掉(Supress)」不要讓它出現在使用者面前可能還比較好。
9. 若你要比對字串結尾,請用 '\0' 代表
有些程式設計師因為 '\0' 其實就是數字 0,而在比對字串結尾時,直接使用 0 來比對字串結尾。作者認為這個習慣不好。
10. 請勿濫用 # ifdef
# ifdef 很好用,但很容易讓原始碼雜亂難讀。作者不會建議大家不要用,但他反對連可以用 if ~ else 解決的場合,都濫用 # ifdef。
11. 別把一堆運算子全都擠在同一列
多分成幾列,Debugger 可以比較容易指出發生錯誤的是在哪個環節。
12. 當你「拷貝貼上」程式碼時,特別注意「最後一列效應」
作者還是不太建議濫用拷貝貼上,他認為需要重複使用一段程式碼,不如好好考慮寫成稍有彈性的函數,然後重複叫用。此外,他建議大家去看「最後一列效應」這篇文章(連結在本文),並了解最後一列效應在拷貝貼上程式碼內,所扮演的角色。
13. 程式碼若很長,盡量多折幾列,然後排成像表格般一樣整齊(Table-style)
14. 好編譯器 + 好的寫碼習慣是不夠的
內文舉了個後括號「)」括錯位置,但編譯器抓不出來的例子。
15. 若有一堆意義相關的常數,請用 enum 括住它們
16. 「看我能把程式碼寫得這麼屌!」的炫耀寫碼心態不可取
寫程式碼要以「穩」「易讀」為主,不是把一些剛學不久,覺得很酷,但三個月後會忘個精光的技術用進程式碼內。
17. 想用程式碼把一塊資料清乾淨,最好把清除程式碼獨立拉出來成一個專屬函數
18. 你在一個語言行得通的方法,在另一個語言不一定行得通
19. 盡量用技巧避免在同一個類別內,建構函數彼此呼叫的情況
20. 讀檔時,只檢查有沒有讀到檔尾(EOF)似乎是不夠的
21. 正確檢查 EOF 的方法
22. 有比使用 # pragma warning(...) 來印錯誤訊息更好的方法,勿濫用
23. 如果你想取得字串長度,用函數自動幫你算,別用手算然後硬填數字上去
24. 請多使用 "override" 與 "final",它們會是你的好朋友
25. 別再把 "this" 指標跟 "nullptr"(空指標)拿來作比較
26. 小心使用 VARIANT_BOOL 這個陰險狡猾的東西
27. BSTR(Binary STRing)這個用於微軟 COM/Automation 技術中的資料型態,請小心使用
28. 能用函數把一段程式碼包起來重複用,就別用巨集包它(使用巨集函數的缺點多於優點)
29. 在迴圈或迭代程式碼間,使用 ++i,來取代 i++(i++ 編譯後的執行效能稍微差那麼一點)
30. wprintf() 函數的使用陷阱:Win32 印寬字元字串要用 %S(大寫),Win64 要用 %s(小寫)。
31. 陣列在 C/C++ 傳給函數時,並非是「傳值呼叫」(Call by Value)
32. 要把檔案內的文字直接印在螢幕上時,請不要直接使用 printf() (怕檔案內夾雜 % 開頭的字,這些字對 printf 是有特殊意義的)
33. 想對一個指標取值(亦即:*p),記得檢查它是否為 NULL。否則你對 NULL 取值會導致系統出錯的
34. 別以為 int 的上限 21億+ 很多,在 64 bits 系統中,這個數字很容易爆掉
35. 若您把 enum 常數與 switch~case 連用,增加新元素進 enum 時也別忘了加新 case 進 switch
36. 如果有怎麼抓都抓不出來的 bugs,記得往「記憶體」的方向去思考(32bits vs. 64bits 之類的問題)
37. 在 do~while() 內用 continue 指令要小心,有可能會跳過你放在底部的「更新條件」,導致無窮迴圈
38. 對於指標,請用 nullptr 代替 NULL,這是新的 C++ 規格書希望您遵循的
39. 試著別把一列式子搞得太複雜,這樣比較不會有「咦?為何這段寫錯的程式碼居然可以運作」的問題出現
40. 開始使用「原始碼靜態分析工具」吧!
41. 別為了要使用某函式庫的一個函式,而引進整個函式庫。如果只用了一個函式,建議自己寫比較容易維護。
42. 別再用 empty 這個曖昧的字眼當函數名稱了。用 erase(), clear() 都比 empty() 好。
如果您覺得小弟翻譯了這麼多,沒有功勞也有苦勞,那就麻煩按個讚犒賞小弟一下吧!當然歡迎轉發給您 Facebook 的朋友共同討論。最後提醒一句,上述 42 點別把它們全都當聖旨,親身體會驗證才是最重要的喔!
祝福大家假期愉快!
c++例外處理 在 紀老師程式教學網 Facebook 的最佳解答
關於程式設計的搞笑漫畫(輕鬆一下)
這個版一直都很嚴肅吼?好吧!今天貼點不一樣的!來個四格搞笑漫畫吧!...當然還是跟程式設計有關。 XD
幫大家翻譯一下:
(1)
Java:好的,有沒有任何建議,可以讓女性對我們更有興趣呢?
(梗:程式設計一直都不受女性青睞,女性程式設計師的比例一直偏低)
(2)
C++:對她們特別對待?
(梗:exceptions 是 C++ 中的「例外處理」之意。所以也可以翻譯成「製造更多例外處理」。「例外處理」是 C++ 語言其中之一的特色。)
Python:重新定義我們對待他們的方法?
(梗:method 也是 Python 物件導向內的函數。所以也可以翻譯成「重新定義物件內的方法(函數)」)
ANSI C:停止把她們當成「東西」來看待?
(梗:object 是物件導向程式設計裡的「物件」。所以也可以翻譯成「不要再把他們當成「物件」看待?」)
(3)
(ANSI C 被丟出窗外)
(梗:這個梗是因為,在場的其它三個語言:Java、C++、Python,都是物件(Object)導向語言,只有 ANSI C 不是。他說「不要再把他們當成物件」,等於說「不要用物件導向」。對於其它三者來說,當然是來砸場子的)
http://i.imgur.com/VbothY8.jpg
c++例外處理 在 吳老師教學部落格 Youtube 的最佳貼文
JAVA物件導向程式設計課程上課影音(10)
完整影音:
http://www.youtube.com/playlist?list=PLsE34duTsJQwCh30WfQP5XVNMt1ngR3Ue
論壇:
https://groups.google.com/forum/?hl=zh-TW#!forum/java_object
01_巢狀類別與多形與套件
02_C9_1_1巢狀類別範例
03_C9_1_2內層類別的使用
04_C9_2_1類別繼承的匿名內層類別
05_C9_2_2實作介面的匿名內層類別
06_C9_2_3匿名內層類別與this和final關鍵字
07_CH9_4_1使用類別繼承來實作多形
08_CH9_4_2使用介面來實作多形
09_如何加掛Android開發環境
10_如何安裝Android_SDK
11_Android版本分析與套件和import敘述
相關JAVA教學:
JAVA01_基本概說
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA02_流程控制敘述
http://www.youtube.com/playlist?list=PL0EADCF8F06B00BA4&feature=view_all
JAVA03_舉範例說明
http://www.youtube.com/playlist?list=PL64C8D9D3E8DD932D&feature=view_all
AWT視窗窗物
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA05_事件處理
http://www.youtube.com/playlist?list=PLA7BC9C0DA74C9DA1&feature=view_all
TQC_JAVA解題
http://www.youtube.com/playlist?list=PLEAD98F19A4702915&feature=view_all
android入門(淡江)
http://www.youtube.com/playlist?list=PLFCA1F8C48C3FEDC9&feature=view_all
1010109德明資科系TQC+ANDROID研習心得(學生)
https://www.youtube.com/playlist?list=PLE4192ECF9FB645E7&feature=view_all
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
c++例外處理 在 吳老師教學部落格 Youtube 的精選貼文
JAVA物件導向程式設計課程上課影音(10)
完整影音:
http://www.youtube.com/playlist?list=PLsE34duTsJQwCh30WfQP5XVNMt1ngR3Ue
論壇:
https://groups.google.com/forum/?hl=zh-TW#!forum/java_object
01_巢狀類別與多形與套件
02_C9_1_1巢狀類別範例
03_C9_1_2內層類別的使用
04_C9_2_1類別繼承的匿名內層類別
05_C9_2_2實作介面的匿名內層類別
06_C9_2_3匿名內層類別與this和final關鍵字
07_CH9_4_1使用類別繼承來實作多形
08_CH9_4_2使用介面來實作多形
09_如何加掛Android開發環境
10_如何安裝Android_SDK
11_Android版本分析與套件和import敘述
相關JAVA教學:
JAVA01_基本概說
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA02_流程控制敘述
http://www.youtube.com/playlist?list=PL0EADCF8F06B00BA4&feature=view_all
JAVA03_舉範例說明
http://www.youtube.com/playlist?list=PL64C8D9D3E8DD932D&feature=view_all
AWT視窗窗物
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA05_事件處理
http://www.youtube.com/playlist?list=PLA7BC9C0DA74C9DA1&feature=view_all
TQC_JAVA解題
http://www.youtube.com/playlist?list=PLEAD98F19A4702915&feature=view_all
android入門(淡江)
http://www.youtube.com/playlist?list=PLFCA1F8C48C3FEDC9&feature=view_all
1010109德明資科系TQC+ANDROID研習心得(學生)
https://www.youtube.com/playlist?list=PLE4192ECF9FB645E7&feature=view_all
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
c++例外處理 在 吳老師教學部落格 Youtube 的精選貼文
JAVA物件導向程式設計課程上課影音(10)
完整影音:
http://www.youtube.com/playlist?list=PLsE34duTsJQwCh30WfQP5XVNMt1ngR3Ue
論壇:
https://groups.google.com/forum/?hl=zh-TW#!forum/java_object
01_巢狀類別與多形與套件
02_C9_1_1巢狀類別範例
03_C9_1_2內層類別的使用
04_C9_2_1類別繼承的匿名內層類別
05_C9_2_2實作介面的匿名內層類別
06_C9_2_3匿名內層類別與this和final關鍵字
07_CH9_4_1使用類別繼承來實作多形
08_CH9_4_2使用介面來實作多形
09_如何加掛Android開發環境
10_如何安裝Android_SDK
11_Android版本分析與套件和import敘述
相關JAVA教學:
JAVA01_基本概說
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA02_流程控制敘述
http://www.youtube.com/playlist?list=PL0EADCF8F06B00BA4&feature=view_all
JAVA03_舉範例說明
http://www.youtube.com/playlist?list=PL64C8D9D3E8DD932D&feature=view_all
AWT視窗窗物
http://www.youtube.com/playlist?list=PLFBAB7C198182C71F&feature=view_all
JAVA05_事件處理
http://www.youtube.com/playlist?list=PLA7BC9C0DA74C9DA1&feature=view_all
TQC_JAVA解題
http://www.youtube.com/playlist?list=PLEAD98F19A4702915&feature=view_all
android入門(淡江)
http://www.youtube.com/playlist?list=PLFCA1F8C48C3FEDC9&feature=view_all
1010109德明資科系TQC+ANDROID研習心得(學生)
https://www.youtube.com/playlist?list=PLE4192ECF9FB645E7&feature=view_all
JAVA證照考題解答分享,Android證照的跳板
http://terry55wu.blogspot.com/2012/01/java.html
JAVA程式設計總整理
http://terry55wu.blogspot.com/2011/10/java.html
湜憶電腦 TQC JAVA進階級先修課程
http://terry55wu.blogspot.com/2010/08/tqc-java.html
最近的生活很JAVA兼分享GOOGLE服務在教學上的應用
http://terry55wu.blogspot.com/2010/05/javagoogle.html
文化大學推廣部JAVA程式設計第 2 次上課
http://terry55wu.blogspot.com/2010/05/java-2.html
文化大學推廣部JAVA程式設計第 3 次上課
http://terry55wu.blogspot.com/2010/05/java-3.html
文化大學推廣部JAVA程式設計第 4 次上課
http://terry55wu.blogspot.com/2010/05/java-4.html
文化大學推廣部JAVA程式設計第 5 次上課
http://terry55wu.blogspot.com/2010/05/java-5.html
Java、VisualBasic、Visual C++有什麼不一樣呢?
http://terry55wu.blogspot.com/2009/03/javavisualbasicvisual-c.html
程式語言排行榜,C語言居冠,JAVA次之
http://terry55wu.blogspot.com/2010/05/cjava.html
Android程式開發證照教學懶人包
http://terry55wu.blogspot.com/p/android.html
吳老師,TQC,JAVA,電腦證照,JAVA工程師,AWT類別,線上教學,雲端計算,(吳老師提供)
c++例外處理 在 C++ exception 例外處理 的推薦與評價
本篇介紹c++ exception 例外處理,程式在執行過程中可能會發生一些特殊情況的異常,例如:記憶體 ... g++ cpp-exception.cpp -o a.out -std=c++11 ... <看更多>
c++例外處理 在 C++程式語言第十三章13-1 C++的異常例外Exception處理 ... 的推薦與評價
... 虛擬virtual基礎類別C++程式語言第十三章13-1 C++的異常例外Exception處理,try_catch子 ... ... <看更多>
c++例外處理 在 [心得] R 的例外處理- 看板R_Language - 批踢踢實業坊 的推薦與評價
[關鍵字]: R, 例外處理, exception
[重點摘要]: 簡單的分享我對於R 的例外處理相關的心得
R 的官方文件在[Exception
handling](https://cran.r-project.org/doc/manuals/R-lang.html#Exception-handling)
有介紹R的例外處理機制。
這裡我簡單介紹如何在R寫出類似java、c++或python等主流語言所使用的try-catch機制
。
另外這裡講的都是以R2.15為主。
# 錯誤相關的函數
- `warning(...)`: 拋出一個警告
- `stop(...)`: 拋出一個例外
- `surpressWarnings(expr)`: 忽略`expr`中發生的警告
- `try(expr)`: 嘗試執行
- `tryCatch`: 最主流語言例外處理的方法
- `conditionMessage` : 顯示錯誤訊息
# R 和其他主流語言的不同
R 語言處理例外的方式,是透過函數,而非像其他主流語言使用try ... catch ... 等語
法。這是因為R 語言幾乎所有功能都是用函數來實作的。請參考[Every operation is a
function
call](https://github.com/hadley/devtools/wiki/Functions#every-operation-is-a-function-call)
。
# 一個`try`的範例
我自己最早是先發現`try`函數。`try`的用法近似於回傳expr的結果*或*執行時發生的錯
誤。
```r
result <- try(..., silent=TRUE)
if (class(result) == "try-error") {
... # 錯誤處理
}
```
由於R是我第一個語言,所以我也就接受他了。直到我後來發現主流語言的try -- catch
機制後,才覺得奇怪。
# 一個`tryCatch`的範例
後來我發現`tryCatch`函式提供了比較類似try -- catch機制的錯誤處理方法。
```r
tryCatch({
result <- expr
}, warning = function(w) {
... # 警告處理
}, error = function(e) {
... # 錯誤處理
}, finally {
... # 清理
}
```
這種語法和其他主流語言的機制比起來接近多了。
# `conditionMessage`
有時候當錯誤發生時,我無法處理,需要直接回傳錯誤訊息給使用者時,或是log起來時
,我們可以在`tryCatch`中使用`conditionMessage`來擷取錯誤訊息。
```r
tryCatch({
stop("demo error")
}, error = function(e) {
conditionMessage(e) # 這就會是"demo error"
})
```
# 錯誤處理的相關issue
就我的經驗來說,寫出一個穩健的程式碼是非常不容易的。在軟體工程中有許多文章介紹
如何寫出這類程式碼。
大部份R 寫出來的script都是只用一次的,所以程式穩定不穩定就不是重點,也因此大家
都很少去使用R 的例外處理機制。
某些R 使用者,會需要寫出自動化的script。而這時候為了要讓迴圈不中斷,使用者才開
始使用例外處理。
但是當寫到套件時,例外處理就很重要了。這時候,函數的使用者將不再是開發者自己,
而還包括其他的使用者,甚至是其他的開發者。此時例外處理就變成一門哲學了。這部份
我也只略懂皮毛,下面只列出少許我知道的issue:
- 釋放資源: 由於錯誤發生時,函數會在不正常的地方退出,所以此時需要釋放一些函數
中獲得的資源(如資料庫連線需要關閉)。這部份在C++可以用
[RAII](https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)等
技術來保證資源不會被忘記釋放。然而在R中,我還不知道有什麼類似的安全機制。
- exception safety guarantees: 當使用者要基於某些函數建立複雜的程式時,通常希
望這些函式是不會出錯的。[Exception
safety](https://en.wikipedia.org/wiki/Exception_safety)就是在探討相關的issue。
畢竟使用的函數有例外狀況時,原本的函數也跟著會有例外狀況。就像是蓋在危樓上的樓
層,一定也很危險一樣。目前我也尚未看過R在這部份的功能。
- 錯誤訊息: 當錯誤發生時,提供的錯誤訊息是否能幫助使用者找到發生錯誤的理由。R
在這部份也很不足,這造成要除錯R的程式時,沒有相當的經驗,是無法理解錯誤訊息的
。
# 參考資料
- [Exception
handling](https://cran.r-project.org/doc/manuals/R-lang.html#Exception-handling)
- [Using R — Basic error Handing with
tryCatch()](https://mazamascience.com/WorkingWithData/?p=912)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.228.124.114
... <看更多>