《數據結構與算法》用到了錯誤處理ErrorCode,但是書本上的錯誤處理只是返回一個枚舉類型,但是並沒有告訴用戶發生了什么了類型的錯誤。
最近看了啊舟的的一個錯誤處理的代碼,用的是try-catch-throw來處理錯誤,想到自己學得不好所以來重新地學一下。
try-catch-throw
try后面要用花括號括起來一段代碼塊block1,catch后面要用花括號括起來一段代碼塊block2。throw 拋出的是一個類型。
首先“嘗試”執行block1中的代碼,嘗試過程中是一直被監視的,一旦catch到了一個throw出來的錯誤信息,那么try就停止執行,但是try語句塊前面執行過的依然算數。
若block1里面的代碼全部執行完畢之后都沒有catch到錯誤信息,那么就跳過block2的代碼。
一旦catch到了錯誤信息,那么就要執行block2當中的代碼,同時還得在catch關鍵字后面的括號里提出需要捕獲的throw出來的東西的數據類型。
如:catch (char* s)
//ps1:圓括號里面的數據類型要與throw出的數據類型相同,否則代碼執行過程中會出現錯誤
//ps2:圓括號里面不能為空,否則編譯器會報錯(你得告訴計算機需要捕獲一個什么樣的錯誤類型)
throw 后面直接加變量就行了,如:throw "bad hmean() arguments:a=-b not allowed";
//ps:throw代碼可以在try內執行,也可以在try里面的一個函數里面被拋出
計算調和平均數的代碼
/try測試
#include<iostream> using namespace std; double hmean(double a,double b) { if(a==-b) { throw "bad hmean() arguments:a=-b not allowed"; cout<<"throw之后還執行"<<endl; } return 2.0*a*b/(a+b); } int main() { double x,y,z; int a=1; cout<<"輸入兩個數字:"; while(cin>>x>>y) { try { a+=2; cout<<"前面執行過的東西"<<endl; z=hmean(x,y); a++; } catch (char* s) { cout<<s<<endl; cout<<"輸入一對新的數字:"; continue; } cout<<"調和均值是"<<z<<endl; cout<<"輸入另外兩個數字,按q退出"; } cout<<endl<<"a="<<a<<endl; return 0; }
測試結果:
同時,catch接受的錯誤類型還可以是enum類型
/try_enum測試
#include<iostream> using namespace std; enum ErrorCode{error_A,error_B}; int main() { int x,y,z; cout<<"輸入兩個數字:"; cin>>x>>y; try { if(x==y) throw error_A; if(x>y) throw error_B; cout<<x+y<<endl; } catch(ErrorCode e) { if(e==error_A) cout<<"輸入的兩個數字相等"<<endl; else if (e==error_B) cout<<"輸入的第一個數字比第二個數字要大"<<endl; } return 0; }
測試結果:
以后就可以在一個頭文件里面放自己的錯誤處理代碼,可以真正的做到錯誤處理,比書本上的好多了。