看板 C_and_CPP 關於我們 聯絡資訊
基本上我覺得書上都會有答案... ※ 引述《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