Re: [閒聊] 尋求比nest-if更優美的解決辦法

看板C_and_CPP作者 (CA)時間15年前 (2011/01/05 23:10), 編輯推噓2(2012)
留言14則, 3人參與, 最新討論串20/21 (看更多)
※ 引述《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

01/05 23:22, , 1F
就我的看法, 例外的繼承體系有需要還可以做得更龐大,
01/05 23:22, 1F

01/05 23:23, , 2F
每個類別不僅各自代表獨特的錯誤狀態, 也透過繼承體系
01/05 23:23, 2F

01/05 23:24, , 3F
可以暗示使用者該怎麼用較一般性的方法來處理這個錯誤
01/05 23:24, 3F

01/05 23:24, , 4F
或者乾脆重丢給 caller 去傷腦筋, 除了多型帶來的擴充
01/05 23:24, 4F

01/05 23:26, , 5F
性, 在 signature 也可標示會丟出的例外, 甚至限定子
01/05 23:26, 5F

01/05 23:26, , 6F
類的例外種類, 這些都是 return error code 辦不到的
01/05 23:26, 6F

01/05 23:47, , 7F
我倒是不建議用 signature 的例外限制,它只說明
01/05 23:47, 7F

01/05 23:48, , 8F
"如果丟出了其他例外將是個嚴重錯誤",它會喚起一個
01/05 23:48, 8F

01/05 23:48, , 9F
handler, 但整個程式只能有一個 handler
01/05 23:48, 9F

01/05 23:49, , 10F
C++ 其實無法做到如同 Java 那樣效果
01/05 23:49, 10F

01/06 00:04, , 11F
所以通常不會用 exception specification, 用了還亂丟
01/06 00:04, 11F

01/06 00:05, , 12F
的函式庫丟棄! XD
01/06 00:05, 12F

01/06 00:06, , 13F
    ^直接
01/06 00:06, 13F

01/07 05:54, , 14F
感謝! 提到很多我沒想到的東西!
01/07 05:54, 14F
文章代碼(AID): #1D98drW3 (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 20 之 21 篇):
文章代碼(AID): #1D98drW3 (C_and_CPP)