看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言: : class Foo : { : void intit(){ try{.new 那些instance;..} catch{} } : }; : intit(){ 做到一半可能有exception 我有catch 導致 接下來的code都沒跑 : 我這case 是不是設計不良?還是怎樣導致 如果你 new 的過程有可能失敗, 那你要嘛想辦法讓他一定成功,要嘛就是丟出一個 exception, 你現在的做法是用一個 catch 把系統給你的 exception 抓住, 我不知道你是怎麼處理他,但是我猜你沒有處理他,你只是單純把他吃掉了。 這樣的做法, 等同於火災的時候警報器喔咿喔咿你卻嫌他吵直接把他打爛, 然後到板上來問:「請問我要怎麼知道是不是發生火災了?」XD 所以轉回頭,還是回歸原點: 如果你 catch 到一個 exception, 要嘛你就完整的處理他,比方說從別處取得資源配置,或是傳回 error code, 要是你沒辦法完整處理,那你就要再丟出一個 exception,讓更上一層的人去處理, 千萬不能沒處理好就把 exception 給吃了, 這樣等同於掩耳盜鈴,終究還是要給貓抓去的。 所以你的 init() 跟 getInstance() 可能要像這樣實作 // 有可能失敗,會丟出 exception void init() { ... } // 成功則傳回物件指標 // 失敗則傳回 nullptr,也就是 error code Foo* getInstance() { if ( _inst != nullptr ) { return _inst ; } try { _inst = new Foo() ; return inst ; } catch ( ... ) { rollback() ; // 釋放那些被配置一半的資源 return nullptr ; } } 則 getInstance() 的行為規格就是兩條路: 1. 成功,傳回指標。 2. 失敗,傳回 nullptr。 當然規格不一定要這樣訂, 你也可以選擇丟出一個 exception。 總之,當錯誤發生且你無法處理的時候, 你要讓上一層的人可以察覺到這個錯誤。 -- To iterate is human, to recurse, divine. 遞迴只應天上有, 凡人該當用迴圈.   L. Peter Deutsch -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.160.114.155
QQ29:yoco大 為什麼_inst = init?? 11/26 00:40
QQ29:我意思是 new Foo的動作是在哪裡做呀 11/26 00:40
legnaleurc:那行你改成 new 就好了吧 11/26 01:15
legnaleurc:反正重點是, init 和 new 不能吃掉全部的 exception 11/26 01:16
legnaleurc:至少要讓它傳播到 getInstance 再處理, 否則無法察知 11/26 01:17
yoco315:因為我寫錯了 QQ 我改 我改 11/26 06:05
※ 編輯: yoco315 來自: 118.160.106.135 (11/26 06:05)