使用try和catch捕獲異常
在捕獲異常方面,try和catch是重要的c++關鍵字。要捕獲語句可能發生的異常,可將它們放在try塊中,並使用catch塊對try塊可能引發的異常進行處理。
#include using namespace std;
int main()
catch (...)
return 0;
}
上述程式,動態輸入乙個new陣列的大小,輸入乙個非法值(比如負數),將導致記憶體分配異常。要檢測的語句放在try中,異常出現之後的處理,放在catch塊中。catch(...)引數...意味著catch將捕獲所有異常。
捕獲特定型別的異常
#include #include// include this to catch exception bad_alloc
using namespace std;
int main()
catch (std::bad_alloc& exp)
catch(...)
return 0;
}
上面的程式中,有兩個catch塊語句,第乙個專門用來捕捉特定的異常:bad_alloc&;而下面的那個catc(...)語句則是,捕捉所有未被顯示的異常(解決漏網之魚)。
使用throw引發特定型別的異常
你可以通過關鍵字throw引發自己選擇的異常。
void dosomethiing()
下面的列子,演示了如何引用throw引發的自定義異常。
#includeusing namespace std;
double divide(double dividend, double divisor)
int main()
catch(char* exp)
return 0;
}
上述**表明,通過捕獲型別為char*的異常,可捕獲呼叫函式divide( )可能引發的異常。一般的做法是把可能引發異常的語句放在try塊中,把整個main()語句都放在try塊中是不合適的,因為異常處理也可能降低**的執行效能。
異常處理的工作原理
每當使用throw引發異常時,編譯器都將查詢能夠處理該異常的catch(type)。異常處理首先檢查引發異常的**是否包含在try塊中,如果是則查詢可處理異常的catch(type)。如果throw不在try塊內,或者沒有與引發的異常相容的catch(type),異常處理將在呼叫函式中尋找。因此,異常處理邏輯沿呼叫棧向上逐個地在呼叫函式中尋找,直到找到可處理異常的catch(type)。在退棧過程的每一步中,都將銷毀當前函式的區域性變數,因此這些區域性變數的銷毀順序與建立順序相反。
以上的程式可能不好理解,通過單步除錯可以查詢函式的呼叫的順序。ps:引發異常時將對區域性物件呼叫函式。
如果因出現異常而被呼叫的析構函式也發生了異常,將導致應用程式終止異常。
從std::exception 派生出自定義的異常類
可以引發所有的異常,然而讓自定義異常繼承std::exception 的好處在於,現有的異常處理程式catch(const std::exception&)不但能捕獲bad_alloc、bad_cast等異常,還能捕獲自定義異常,因為它們的基類都是exception.
#include #include #include using namespace std;
class customexception: public std::exception
// redefining virtual function to return 'reason'
virtual const char* what() const throw()
};double divide(double dividend, double divisor)
int main()
catch(exception& exp)// catch customexception, bad_alloc, etc
return 0;
}
學習大概就是一點點的積累吧,永遠保持一顆學習的心很重要。 的異常處理 C 異常處理總結
做開發不僅僅要考慮到業務邏輯更要在寫 時將各種可能考慮周全,但是這又是很難的事情,畢竟開發就是個人的事,而使用者可能上萬甚至百萬級別。這時,程式的穩定性就極為重要,我們不能讓程式因為某一處執行出問題而就直接導致程式或者產生其他更嚴重的後果,比如 做除法時當除數為零時,陣列訪問越界時,容器capaci...
異常處理(二 C語言的異常處理)
1 異常終止 標準c庫提供了abort 和exit 兩個函式,它們可以強行終止程式的執行,其宣告處於 標頭檔案中。這兩個函式本身不能檢測異常,但在c程式發生異常後經常使用這兩個函式進行程式終止。下面的這個例子描述了exit 的行為 code include include int main void...
C 的異常處理
c 的異常處理用到 try catch try塊是乙個普通的程式塊,就一般運 況而言跟沒有tryd的情況是一樣的,但在異常出現時,往往把可能出現異常的一些語句,包括函式的呼叫,比如在資料庫程式設計程式設計中,一些管理資訊系統在連線資料庫的時候 特別是ado方式 往往會把資料庫的連線與表的開啟語句放在...