精華區beta C_and_CPP 關於我們 聯絡資訊
C++ Exception 主要的功能,是避免 bug 擴散,就是當某個模組 的關鍵任務失敗時,強迫上層模組(不管是哪一層,總之一定要 有一個)負責處理異常。如果異常沒有被處理,就中斷程式。 學會 exception 之後,通常的情況是有些人開始大量使用 throw exception 的方式編寫程式,但有些地方其實不應該用 exception。 例如: char *strcpy(char *dest, const char *src) { if (!dest || !src) { throw "xxxxx"; } ... } 像這個例子,strcpy 函式拋出異常好不好呢?答案是不太好。 當然,不是說這樣設計不可以,只是不太適當。 因為如果呼叫 strcpy 的模組,竟然傳入空的位址,那顯然 strcpy 是不可能完成任務的,但這「責任」不在 strcpy 身上,而是呼叫 它的模組。因此,類似這種狀況,以 assert 的方式更理想: char *strcpy(char *dest, const char *src) { assert(dest && src); ... } 和 throw exception 的方式相比,差別在於,如果使用拋出異常的 方式,萬一上層的某一層模組有做 try catch(...) 的動作,讓異常 被草草略過,那這個 bug 就被忽略了。 因此,像這種「錯誤的責任不在自己本身」的狀況時,assert 是比 throw 異常更嚴謹的方式。 關於這部份,有興趣的人可以參考 Design by Contract(契約式設 計)一書,它是以 Eiffel 語言為範例。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.214.120
godfat:還要 try 好麻煩啊…一直覺得這個機制不理想 61.224.44.22 08/14
fallenball:推...不錯的心得140.115.221.180 08/14
renderer:這個板真好 總是有大大能說出自己的心得 222.156.10.167 08/14
renderer:推呀 222.156.10.167 08/14