作者gocpp (cpp)
看板C_and_CPP
標題[心得] 關於 C++ Exception(適用時機)
時間Sun Aug 14 01:39:41 2005
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