作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] try catch(...)的問題
時間Fri Oct 28 16:05:15 2011
基本上我覺得書上都會有答案...
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: try
: {
: 1. throw; //跑到這行就掛了?
不指定 exception object 的意思是在 catch block 中重丟 exception
比如說:
try{
...
}catch(...){
Log("Some exception happened!");
throw;
}
這邊的 throw 會把同一個 exception 物件繼續往上一層丟
而你沒弄懂它是拿來 rethrow 而把它放在 catch block 以外的地方
依照 C++ 標準 15.1p8:
If no exception is presently being handled, executing a throw-
expression with no operand calls terminate() (15.5.1).
: 2. throw exception(); //會進到catch
: 3. int a, b = 0; a= 1/b; //catch不到....
: 4. int *ptr = 0; *ptr = 5566; //catch 不到
: }
: 我比較想了解 為啥 1,3,4都catch不到 1 和 2 有什麼差異嗎?
一併解釋 3 和 4
原因很簡單就是 C++ 重視執行效率
所以規定 3 和 4 是 undefined behavior
如果對這兩種情況都需要拋出 exception
那麼程式碼的執行效率會大幅降低
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.3.139
推 QQ29:l大意思是說...有些很蠢的人造exception 是無法catch得到嗎? 10/28 16:32
→ QQ29:因為我比較熟C#....他啥都可以吃 我以為C++也是這樣... 10/28 16:32
→ QQ29:我自己估到這網頁 他中間好像有講到我實驗的null pointer 10/28 16:33
→ QQ29:不過他似乎是說可以catch的到 win2000系統....我現在是VC 10/28 16:34
→ QQ29:+win7 難道行為會有差嗎? 這是OS define的嗎 10/28 16:34
→ QQ29:這樣感覺C++的exception只能catch 明文規定的type 和自訂的? 10/28 16:35
→ QQ29:而C#是把3和4都算是一種 exception type嗎 10/28 16:35
推 tropical72:推 :) 10/28 16:46
→ littleshan:無法catch到的原因不是因為它很蠢,而是catch要成本 10/28 16:59
→ littleshan:因為compiler不知道這段code被誰呼叫、以及呼叫端是否 10/28 17:00
→ littleshan:有做catch,所以如果你希望null access可以被catch到 10/28 17:00
→ littleshan:那麼compiler要在所有的指標操作前加上null check 10/28 17:01
推 VictorTom:推:) 10/28 23:09