[心得] 例外處理

作者: ypf791 (路人1號)   2012-11-10 19:23:49
大家好 我又來騙文章數和P幣了(笑)
這次主要想討論關於C++的例外處理
但是因為我跟C++的例外很不熟 (計程應該沒上過吧?)
反而Java的稍微熟一點
不完整的部分請大神們補完
================================================================================
在C++中 有些函數會丟出(throw)例外
像string的substr成員函數 就有可能會丟出out_of_range型別的例外物件
new之類的好像也會丟bad_alloc的樣子
當某個函數throw例外時 那個函數就會中止運作
而呼叫函數端則會收到這個例外
如果呼叫端沒有寫任何處理用的程式碼
那就會把這個例外從該點再往外丟
直到這個例外被處理為止
┌──────────────────────┐
│ int main(int argc, char** argv) │
│ { │
│ ... │
│ func_ex(); //可能丟出例外的函數 │
│ ... //如果 func_ex 丟出了例外 │
│ //則這個區塊的程序不執行 │
│ } │
└──────────────────────┘
上面這個陽春的例子 是說main呼叫了一個可能丟出例外的函數
雖然我們沒有做任何處理 但是C++有預設的處理方式
這個例外就在被丟出main的時候被系統自動handle
================================================================================
前文不斷提到"處理例外"
C++中對例外的處理是透過 try...catch 的方式 (Java也是)
直接看例子好了
┌──────────────────────────┐
│void func() { │
│ throw bad_alloc(); │
│} │
│ │
│int main() │
│{ │
│ ... │
│ try { │
│ func(); │
│ } │
│ catch(bad_alloc ex) { │
│ cerr << "file open failed\n"; │
│ } │
│ ... //will be executed after exception handling │
│} │
└──────────────────────────┘
對於可能產生例外的程序段 我們用try包起來
底下緊接著catch撰寫對不同型別例外的處理
func裡則示範了手動丟出例外的語法: throw [variable];
這裡的variable其實只要是變數就可以了 隨便丟都沒差
Note:
1. 一個try後面可以跟很多個catch 但是每個catch處理的例外型別
不能一樣
2. try裡面包含的程序不一定全都會產生例外 (還滿廢話的)
3. 如果想捕捉任何型別的例外 可以寫catch(...)
小括弧裡面就真的是三個小數點無誤
4. 所以 如果處理了某些型別的例外後 想在最後加上default的例外處理
可以寫成
try{......}
catch(type1 t){......}
catch(type2 t){......}
catch(...){......}
5. catch裡面也可以throw
6. 如果catch裡沒有中斷程序的敘述
像是assert return continue break throw之類的
其後的敘述會被執行 第二個例子有標註
================================================================================
感覺Java的還比這嚴格....聽說連int這種東西都可以throw的時候我真的傻了
作者: Phantasnix (凰響)   2011-01-10 21:33:00
對原po的研究精神拜服不已!
作者: ypf791 (路人1號)   2011-01-10 21:48:00
啊對 如果try裡面沒有丟任何例外的話 catch不會執行喔>.^
作者: OckhamsRazor (魏格納的友人)   2011-01-10 22:06:00
9p幣...怎麼可能...
作者: LDPC5566 (Terry)   2011-01-11 12:35:00
應該是先打好再貼 9p幣實在太少了阿~
作者: ypf791 (路人1號)   2011-01-11 14:58:00
感謝樓上指教 原來還有這種差異

Links booklink

Contact Us: admin [ a t ] ucptt.com