您好,欢迎访问三七文档
14例外與範本14.1錯誤處理14-214.1.1簡單錯誤處理14-214.1.2函數錯誤處理14-514.1.3類別錯誤處理14-1114.2函數與範本14-1814.2.1函數範本14-1814.2.2多載範本函數14-2014.2.3使用標準參數14-2214.3範本與類別14-2314.3.1類別範本14-2414.1錯誤處理例外(exceptions)是執行程式發生錯誤或是非預期的事件時,發出警告或錯誤信號。使用例外處理則可以自動監控程式執行時是否產生錯誤。14.1.1簡單錯誤處理應用程式main()一般程式碼try{}catch(){//顯示錯誤訊息}if(錯誤成立)throw14.1.1簡單錯誤處理(續)try{if(錯誤條件)throw參數;}catch(資料型態參數){//顯示錯誤訊息;}14.1.1簡單錯誤處理(續)範例一floatnomer,denom;cout請輸入被除數=;cinnomer;cout請輸入除數=;cindenom;if(denom==0)//若除數等於0cout錯誤:除數為0\n;//則輸出錯誤訊息else//若除數不等於0coutnomer/denomendl;//則輸出運算值14.1.2函數錯誤處理應用程式main()一般程式碼try{//呼叫函數}catch(){//顯示錯誤訊息}{//函數本體}函數funct()if(錯誤成立){throw}問題呼叫正常返回正常呼叫EXCEPTION14.1.2函數錯誤處理(續)傳回型態func(){if(錯誤條件)throw參數;//throw例外return傳回值;}voidmain(){try{func();//呼叫func()函數}catch(資料型態參數){//顯示錯誤訊息;}}14.1.2函數錯誤處理(續)範例一floatdivide(floatnumer,floatdenom){if(denom==0){//若除數等於0cout“錯誤:除數為0\n”;//輸出錯誤訊息return0;//並傳回數值0(邏輯錯誤)}else{//若除數不等於0returnnumer/denom;//則傳回除法運算值}}14.1.2函數錯誤處理(續)範例一(續)intmain(){floatnomerator,denominator,quotient;cout“請輸入被除數:”;cinnomerator;cout“請輸入除數:”;cindenominator;quotient=divide(nomerator,denominator);//呼叫divide函數cout“除法運算值=”quotientendl;//輸出除法運算值return0;}14.1.2函數錯誤處理(續)範例二floatdivide(floatnumer,floatdenom){if(denom==0){//若除數等於0throw“錯誤:除數為0\n”;//投擲例外}else{//若除數不等於0returnnumer/denom;//傳回除法運算值}}14.1.2函數錯誤處理(續)範例二(續)intmain(){floatnomerator,denominator,quotient;cout“請輸入被除數:”;cinnomerator;cout“請輸入除數:”;cindenominator;try{quotient=divide(nomerator,denominator);cout“除法運算值=”quotientendl;}catch(char*divideByZero){//捕捉例外cout“錯誤:除數為0\n”;//則輸出錯誤}return0;}14.1.2函數錯誤處理(續){}應用程式main()//呼叫函數{//函數本體}函數funct()返回呼叫try{}catch(){//顯示錯誤訊息}if(錯誤成立)throw14.1.2函數錯誤處理(續)傳回型態func(){try{if(錯誤條件)throw參數;return傳回值;}catch(資料型態參數){//顯示錯誤訊息;return傳回值;}}voidmain(){func();//呼叫func()函數}14.1.2函數錯誤處理(續)範例三intcheck(inti)//含有throw的函數{try{//tryif(i==0)throwi;//若輸入為0則throwcout“輸入為”iendl;returni;}catch(inti){//捕捉例外cout“輸入為”i“,程式結束!\n”;returni;}}14.1.2函數錯誤處理(續)範例三(續)intmain(){intn;do{cout“請輸入任意整數(輸入0則結束):”;cinn;}while(check(n));//呼叫check函數return0;}應用程式main()一般程式碼try{//呼叫成員函數}catch(){//顯示錯誤訊息}類別資料成員成員函數throw問題呼叫正常返回正常呼叫EXCEPTION14.1.3類別錯誤處理14.1.3類別錯誤處理(續)classTest{public:classAnError{//自定類別型態//沒有程式碼;};傳回型態functA(){if(錯誤條件)throwAnError;//throw類別型態參數return傳回值;}};voidmain(){Testobj;try{obj.functA();}catch(Test::AnError){//catch類別型態參數//顯示錯誤;}}14.1.3類別錯誤處理(續)範例一classStack{//自定Stack資料類別intst[MAX];inttop;public:classRange{};//ERROR類別Stack(){top=-1;}voidpush(inti){if(top=MAX–1)throwRange();//投擲例外st[++top]=i;//否則top=top+1}intpop(){if(top0)//若上限小於0throwRange();//投擲例外returnst[top--];//否則top=top-1}};14.1.3類別錯誤處理(續)範例一(續)intmain(){Stacks;Try{s.push(10);//top=0;st[0]=10;s.push(40);//top=1;st[1]=40;couts.pop()endl;//傳回st[1]=40;top=0couts.pop()endl;//傳回st[0]=10;top=-couts.pop()endl;//top0;throwRange()}catch(Stack::Range){//捕捉例外cout堆疊滿了或空了!;}return0;}14.2範本與函數函數範本(template)代表一個總體性的函數,它可以使用於任何資料型態。intSum(inta,intb){returna+b;}intSum(inta,intb){returna+b;}inta=3;intb=5;intc=Sum(a,b);floatSum(floata,floatb){returna+b;}floatSum(floata,floatb){returna+b;}templateclassTTSum(T&a,T&b){returna+b;}floata=3;floatb=5;floatc=Sum(a,b);14.2.1函數範本templateclass型態範本函數型態函數名稱(參數列){//函數主體}14.2.1函數範本(續)範例一voidSwap(int&a,int&b){//定義Swap函數inttemp;temp=a;a=b;b=temp;}voidSwap(float&a,float&b){//多載Swap函數floattemp;temp=a;a=b;b=temp;}14.2.1函數範本(續)範例二templateclassX//X為範本型態voidSwap(X&a,X&b){Xtemp;temp=a;a=b;b=temp;}intmain(){intx=4,y=10;floatz=6.0,v=17.5;Swap(x,y);//整數對調Swap(z,v);//浮點數對調return0;}14.2.1函數範本(續)範例三templateclassX,classYvoidTest(Xa,Yb){couta''bendl;}intmain(){Test(10,'a');//X為int,Y為charTest(98.6,37D);//X為float,Y為doublereturn0;}14.2.2多載範本函數範例一templateclassX//宣告範本voidSwap(X&a,X&b){//定義Swap()範本函數Xtemp;temp=a;a=b;b=temp;}voidSwap(int&a,int&b){//多載Swap()範本函數Xtemp;temp=a;a=b;b=temp;}14.2.2多載範本函數(續)範例一(續)intmain(){intx=4,y=10;floatz=6.0,v=17.5;Swap(x,y);//呼叫Swap()多載函數Swap(z,v);//呼叫Swap()範本函數return0;}14.2.2多載範本函數(續)範例二templateclassX//宣告一個參數範本voidf(Xa)//定義範本f()函數{cout“f(a)”;}templateclassX,classY//宣告二個參數範本(多載)voidf(Xa,Yb)//定義範本f()函數{coutf(a,b);}14.2.2多載範本函數(續)範例二(續)intmain(){f(3);//呼叫f(a)函數f(3,8);//呼叫f(a,b)函數return0;}14.2.3使用標準參數範例一templateclassX//宣告範本voidf(Xa,intb)//a用型態範本b用整數參數{for(inti=0;ib;i++)cout“”;coutaendl;}intmain(){f(“第8格”,8);//在第8格顯示“第8格”字串f(100,14);//在第14格顯示100return0;}14.3範本與類別範本也可以用於建立總體性的類別和抽象資料型態,類別範本允許使用者建立總體性的類別版本,因此在類別中不需靠複製程式碼來管理多重資料型態。14.3.1類別範本定義類別範本templateclass型態範本class類別名稱{//類別主體}14.3.1類別範本(續)建立類別物件類別名稱型態物件名稱;14.3.1類別範本(續)範例一templateclassTYPE//定義類別範本classTest//定義Test類別{TYPEa;//TYPE變數apublic:Test(TYPEm){a=m;}voidshow(){coutaendl;}};14.3.1類別範本(續)範例一(續)intmain(){Testdoubleobj1(1.025);//定義倍精數物件Testcharobj2(‘a’);//定義字元物件Testchar*obj3(“string”);//定義字串指標物件obj1.show();//顯示1.025obj2.show();//顯示aobj3.show();//顯示stringreturn0;}14.3.1類別範本(續)範例二templateclassTYPE1,classTYPE2classTest//定義Test類別{TYPE1a;//TYPE1變數aTYPE2b;//TYPE2變數bpublic:Test(TYPE1m,TYPE2n){
本文标题:14例外与范本
链接地址:https://www.777doc.com/doc-3721152 .html