Re: [問題] singleton遇到一個瓶頸

看板C_and_CPP (C/C++)作者 (眠月)時間15年前 (2010/11/25 23:32), 編輯推噓2(204)
留言6則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《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

11/26 00:40, , 1F
yoco大 為什麼_inst = init??
11/26 00:40, 1F

11/26 00:40, , 2F
我意思是 new Foo的動作是在哪裡做呀
11/26 00:40, 2F

11/26 01:15, , 3F
那行你改成 new 就好了吧
11/26 01:15, 3F

11/26 01:16, , 4F
反正重點是, init 和 new 不能吃掉全部的 exception
11/26 01:16, 4F

11/26 01:17, , 5F
至少要讓它傳播到 getInstance 再處理, 否則無法察知
11/26 01:17, 5F

11/26 06:05, , 6F
因為我寫錯了 QQ 我改 我改
11/26 06:05, 6F
※ 編輯: yoco315 來自: 118.160.106.135 (11/26 06:05)
文章代碼(AID): #1Cxe5-_o (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1Cxe5-_o (C_and_CPP)