看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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