作者legnaleurc (CA)
看板C_and_CPP
標題Re: [閒聊] 尋求比nest-if更優美的解決辦法
時間Wed Jan 5 23:10:41 2011
※ 引述《POSIX (tedium of chores)》之銘言:
: 因為有點想要了解exception
: 對於這樣的狀況
: 要怎麼設計這個catch 和DataInvalidError exception 呢?
: 如果說每個function ( checkData, modifyData, fireDataChanged, saveDataIntoFile)
: 如果throw 出來的都是DataInvalidError 這個type
: 那勢必catch 還是要用一連串的if
: 去判斷e 這個傳近來的exception 的內容是哪一個function throw出來的
: (或是用switch 的語法)
: 或是說DataInvalidError 這邊是用繼承的技巧(這邊我就不太熟了)
: 讓catch 能夠分辨出來 是哪個type 而得知是哪個function丟出來的
: 是這樣嗎?
這就要靠正確的分類錯誤型別去做到比較好的分派
比方說你可以針對 DataInvalidError 再做更深的繼承去細分錯誤內容
諸如
class DataFormatError : public DataInvalidError;
class DataSavingError : public DataInvalidError;
等
如果你知道如何針對細節去處理,就可以 catch 這些子類別
如果對 client code 而言,失敗就是失敗,它要做統一處理
就是直接 catch DataInvalidError, 或是 std::exception
甚至是最極端的 catch( ... ) 去硬吞所有例外(通常使用在process/thread邊界)
: 感覺有點毛毛的、很詭異的感覺
: 是不是還有其他更美麗的作法?
: 感恩m(_._)m
我不知道這樣的作法美不美麗,但我的習慣是定義一個固定的體系:
// error.h
// 避免 template 造成隱式膨脹, 在這裡先定義必要函式
class BaseError : public std::exception;
// 利用 policy 的方式訂製基礎錯誤類別
template< typename ErrorType >
class Error : public BaseError, public ErrorType;
// client code
class GodDxmn;
typedef Error< GodDxmn > GodDxmnError;
client 可以針對自己的需要自由訂製一個自己的例外類別
--
自High筆記(半荒廢)
http://legnaleurc.blogspot.com/
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.205.248.119
推 loveme00835:就我的看法, 例外的繼承體系有需要還可以做得更龐大, 01/05 23:22
→ loveme00835:每個類別不僅各自代表獨特的錯誤狀態, 也透過繼承體系 01/05 23:23
→ loveme00835:可以暗示使用者該怎麼用較一般性的方法來處理這個錯誤 01/05 23:24
→ loveme00835:或者乾脆重丢給 caller 去傷腦筋, 除了多型帶來的擴充 01/05 23:24
→ loveme00835:性, 在 signature 也可標示會丟出的例外, 甚至限定子 01/05 23:26
→ loveme00835:類的例外種類, 這些都是 return error code 辦不到的 01/05 23:26
→ legnaleurc:我倒是不建議用 signature 的例外限制,它只說明 01/05 23:47
→ legnaleurc:"如果丟出了其他例外將是個嚴重錯誤",它會喚起一個 01/05 23:48
→ legnaleurc:handler, 但整個程式只能有一個 handler 01/05 23:48
→ legnaleurc:C++ 其實無法做到如同 Java 那樣效果 01/05 23:49
→ loveme00835:所以通常不會用 exception specification, 用了還亂丟 01/06 00:04
→ loveme00835:的函式庫丟棄! XD 01/06 00:05
→ loveme00835: ^直接 01/06 00:06
推 POSIX:感謝! 提到很多我沒想到的東西! 01/07 05:54