一、背景
程序運行時常會碰到一些異常情況,例如:
- 做除法的時候除數為 0;
- 用 new 運算符動態分配空間時,空間不夠導致無法分配;
- 訪問數組元素時,下標越界;打開文件讀取時,文件不存在。
這些異常情況,如果不能發現并加以處理,很可能會導致程序崩潰。
所謂“處理”,可以是給出錯誤提示信息,然后讓程序沿一條不會出錯的路徑繼續執行;也可能是不得不結束程序,但在結束前做一些必要的工作,如將內存中的數據寫入文件、關閉打開的文件、釋放動態分配的內存空間等。
二、C++ 異常處理
C++ 引入了異常處理機制。
異常提供了一種轉移程序控制權的方式。C++ 異常處理涉及到三個關鍵字:try、catch、throw。
- throw: 當問題出現時,程序會拋出一個異常。這是通過使用 throw 關鍵字來完成的。
- catch: 在您想要處理問題的地方,通過異常處理程序捕獲異常。catch 關鍵字用于捕獲異常。
- try: try 塊中的代碼標識將被激活的特定異常。它后面通常跟著一個或多個 catch 塊。
舉個例子
#include <iostream>
#include <exception>
using namespace std;
int main () {
try
{
throw 1;
throw "error";
}
catch (const char* str)
{
cout << str << endl;
}
catch (int i)
{
cout << i << endl;
}
}
運行結果
也可以自己定義異常類來進行處理:
#include <iostream>
#include <exception>
using namespace std;
//可以自己定義Exception
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
}myex;
int main () {
try
{
if(true) //如果,則拋出異常;
throw myex;
}
catch (exception& e)
{
cout << e.what() << endl;
}
return 0;
}
三、拋出異常與捕獲異常
可以使用 throw 語句在代碼塊中的任何地方拋出異常。throw 語句的操作數可以是任意的表達式,表達式的結果的類型決定了拋出的異常的類型。
以下是嘗試除以零時拋出異常的實例:
#include <iostream>
using namespace std;
double division(int a, int b)
{
if( b == 0 )
{
throw "Division by zero condition!";
}
return (a/b);
}
int main ()
{
int x = 50;
int y = 0;
double z = 0;
try {
z = division(x, y);
cout << z << endl;
}catch (const char* msg) {
cerr << msg << endl;
}
return 0;
}
運行結果
四、catch(...)的作用
catch(…)能夠捕獲多種數據類型的異常對象,所以它提供給程序員一種對異常對象更好的控制手段,使開發的軟件系統有很好的可靠性。因此一個比較有經驗的程序員通常會這樣組織編寫它的代碼模塊,如下:
void Func()
{
try
{
// 這里的程序代碼完成真正復雜的計算工作,這些代碼在執行過程中
// 有可能拋出DataType1、DataType2和DataType3類型的異常對象。
}
catch(DataType1& d1)
{
}
catch(DataType2& d2)
{
}
catch(DataType3& d3)
{
}
catch(…)
{
}
}
例子
double division(int a, int b)
{
if (b == 0) {
throw "Division by zero condition!";
}
return (a / b);
}
int main() {
try
{
int res = division(10,0);
}
catch (...)
{
cout << " * ********" << endl;
}
return 0;
}
參考:
C++異常處理(try catch throw)完全攻略
c++中try catch的用法
C++ 異常處理
總結
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注html5模板網的更多內容!
【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!