作者yoco315 (眠月)
看板C_and_CPP
標題Re: [問題] singleton遇到一個瓶頸
時間Thu Nov 25 23:32:12 2010
※ 引述《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)