c++ 異常 abort() abort() 函數原型在頭文件cstdlib中 實現方式是:想標準錯誤流發送消息abnormal program termination 然後終止程式 返回一個隨實現而異的值 也可使用exit() 該函數刷新文件緩衝區 但是不顯示消息 返回錯誤碼 一種比異常終止更靈活 ...
c++ 異常
abort()
abort() 函數原型在頭文件cstdlib中 實現方式是:想標準錯誤流發送消息abnormal program termination 然後終止程式 返回一個隨實現而異的值
也可使用exit() 該函數刷新文件緩衝區 但是不顯示消息
返回錯誤碼
一種比異常終止更靈活的方法是 使用函數的返回值來指出問題
主要目的是避免了錯誤輸入的惡果 讓用戶繼續輸入 第三個參數可以是指針或是引用(或是全局變數,但是不推薦)
c++ try_catch
throw語句實際上是跳轉語句 ,throw關鍵字表示引發異常 catch關鍵字表示捕獲異常 try塊標識其中特定的異常可能被激活的代碼塊 後面可以接1..n個catch()
執行throw()語句類似與執行返回語句
可以將對象作為異常類型
try{
//程式拋出異常
throw value;
}
catch(valuetype v){
//例外處理程式段
}
throw拋出值 catch 接受 throw必須在“try語句塊”中才有效
程式接受到throw語句後就會自動調用析構器,把try整體對象clean up 然後進入catch語句 如果在迴圈體中就會退出迴圈
這種機制會引起一些致命的錯誤,比如,當“類”有指針成員變數時(又是指針!),在 “類的構建器”中的throw語句引起的退出,會導致這個指針所指向的對象沒有被析構。這裡很基礎,就不深入了,提示一下,把指針改為類就行了,比如模板類來代替指針,在模板類的內部設置一個析構函數。
語句“throw;”拋出一個無法被捕獲的異常,即使是catch(...)也不能捕捉到,這時進入終止函數,見下catch。
一般的catch出現的形式是:
try{}
catch(except1&){}
catch(except2&){}
catch(...){} //接受所有異常
一般都寫成引用(except1&),原因很簡單,效率。
問題a:拋出異常,但是catch不到異常怎麼辦?(註意沒有java類似的finally語句)
在catch沒有捕獲到匹配的異常的時候,會調用預設的終止函數。可以調用set_terminate()來設置終止函數,參數是一個函數指針,類型是:
void (* terminate)()
到這裡,可以題個問題:“沒有try-catch,直接在程式中"throw;",會怎麼樣?”
直接abort() 可以通過set_terminate() 修改最終行為
其他一些技巧:
4、try一個函數體,形式如下
void fun(type1,type2) try----try放在函數體後
{
//函數定義
}
catch(typeX){}
這個用法的效果就相當於:
void fun()
{
try{函數定義}
}
throw一個函數體,形式如下:目的是限制函數能夠拋出的異常
void fun (); // 能拋出任何類型的異常
void fun () throw(except1,except2,except3)
// 後面括弧裡面是一個異常參數表,本例中只能拋出這3中異常
void fun () throw() // 參數表為空,不能拋出異常
異常規範
以後可能被踢下神壇 但還是要作死樣的瞭解一下
作用之一是告訴用戶可能需要使用try塊 (卻也可以直接使用註釋解決)
另一個作用是 讓編譯器添加執行運行階段檢查的代碼 檢查是否違反了異常規範 (但收效甚微,十分雞肋 當一個函數調用了其他會引發異常的函數 或者 在編寫代碼時不會異常 庫更新後卻會引發異常 )
棧解退
若程式try塊中調用了對引發異常的函數進行調用的函數 則程式將從引發異常的函數跳到包含try塊和處理程式的函數 這過程涉及到 棧解退
c++ 如何處理函數調用和返回?
-----通過將返回地址放在棧中 當函數調用結束 棧彈出繼續執行代碼的地址