大家好 我又来骗文章数和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的时候我真的傻了