Re: [問題] singleton遇到一個瓶頸
※ 引述《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
11/26 00:40, 1F
→
11/26 00:40, , 2F
11/26 00:40, 2F
推
11/26 01:15, , 3F
11/26 01:15, 3F
→
11/26 01:16, , 4F
11/26 01:16, 4F
→
11/26 01:17, , 5F
11/26 01:17, 5F
→
11/26 06:05, , 6F
11/26 06:05, 6F
※ 編輯: yoco315 來自: 118.160.106.135 (11/26 06:05)
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章