




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
異常處理主講教師:陳婷18.1異常的概念18.2異常的實現18.3異常的規則18.4默認異常處理18.5異常派生族系本章內容#include<iostream>usingnamespacestd;voiddivided(doublea,doubleb){//實現兩個浮點數除法doubleresult=a/b;//會不會有問題?cout<<“Result=”<<result<<endl;}intmain(){doublea,b;cout<<“Pleaseinputtwonumbers:”;cin>>a>>b;divided(a,b);//調用divided函數return0;}18.1異常的概念Ch18_01#include<iostream>#include<cstring>usingnamespacestd;intmain(){char*ch;//字符指針longlongsize;cout<<“Pleaseinputsize:”;cin>>size;cout<<"SizeValue:"<<size<<endl;ch=newchar[size];//申請堆空間,是否有問題?cout<<“Pleaseinputastring:”;cin>>ch;cout<<“StringSize=”<<strlen(ch)<<endl;delete[]ch;//釋放堆空間return0;}18.1異常的概念Ch18_02異常(Exception):程序有時會遇到運行階段錯誤,導致程序無法正常地運行下去。例如:程序試圖打開一個不可用的文件請求過多的內存遭遇不能容忍的值說明:運行異常,可以預料,但不能避免,它是由系統運行環境造成的程序要有能夠解決這種運行異常的能力18.1異常的概念異常處理機制使用異常處理機制的步驟:定義異常。將那些有可能產生錯誤的語句框定在try語句塊中。定義異常處理(捕獲異常)。將異常處理的語句放在catch語句塊中,以便異常被傳遞過來時進行處理。拋擲異常。檢測是否產生異常,若是,則通過throw語句拋擲異常。18.2異常的實現
try語句:定義異常
catch語句:捕獲異常
throw語句:拋擲異常#include<iostream>usingnamespacestd;voiddivided(doublea,doubleb){//實現兩個浮點數除法doubleresult;try{//定義異常if(b==0.0)throwb;//拋擲異常result=a/b;cout<<“Result=”<<result<<endl;}catch(doubleval){//捕獲異常cout<<“Exceptionoccurs!Exceptionvalueis”<<val<<endl;}}intmain(){doublea,b;cout<<“Pleaseinputtwonumbers:”;cin>>a>>b;divided(a,b);return0;}18.2異常的實現Ch18_03說明:try語句塊表示塊中的語句可能會發生異常,放在其中加以監控。注意:C++只理會受監控的運行異常。throw后面的表達式的類型被稱為所引發的異常類型。在try語句塊之后必須緊跟一個或多個catch語句,目的是對發生的異常進行處理(注意:try之前不允許出現catch)。catch()括號中的聲明只能容納一個形參,當類型與拋擲異常的類型匹配時,該catch()語句塊便稱捕獲了一個異常而轉到其塊中進行異常處理。catch()形參的值則為throw語句拋擲的異常值。當異常發生時,try語句塊中異常之后的語句不再執行。18.2異常的實現#include<iostream>usingnamespacestd;voiddivided(doublea,doubleb){//實現兩個浮點數除法doubleresult;try{//定義異常if(b==0.0)throwb;//拋擲異常result=a/b;cout<<“a/b=”<<result<<endl;result=b/a;//存在除0異常,未被監控cout<<“b/a=”<<result<<endl;}catch(doubleval){//捕獲異常cout<<“Exceptionoccurs!Exceptionvalueis”<<val<<endl;}}intmain(){doublea,b;cout<<“Pleaseinputtwonumbers:”;cin>>a>>b;divided(a,b);return0;}18.3異常的規則Ch18_04
C++只理會受監控的運行異常#include<iostream>usingnamespacestd;intmain(){intidx;cout<<“Pleaseinputindexvalue:”;cin>>idx;try{//定義異常if(idx==0)throw10;//int型異常elseif(idx==1)throw13.14;//double型異常elseif(idx==2)throw‘c’;//char型異常elsethrow“C++”;//字符串異常}18.3異常的規則catch(intn){//捕獲int型異常cout<<“IntException:”<<n<<endl;}catch(doubled){//捕獲double型異常cout<<“DoubleException:”<<d<<endl;}catch(charc){//捕獲char型異常cout<<“CharException:”<<c<<endl;}catch(char*s){//捕獲字符串異常cout<<“StringException:”<<s<<endl;}return0;}Ch18_05
尋找catch中的最佳匹配來進行異常處理#include<iostream>usingnamespacestd;intmain(){intidx;cout<<“Pleaseinputindexvalue:”;cin>>idx;try{//定義異常if(idx==0)throw10;//int型異常elseif(idx==1)throw13.14;//double型異常elseif(idx==2)throw‘c’;//char型異常elsethrow“C++”;//字符串異常}18.3異常的規則catch(int){//捕獲int型異常cout<<“IntException!”<<endl;}catch(double){//捕獲double型異常cout<<“DoubleException!”<<endl;}catch(char){//捕獲char型異常cout<<“CharException!”<<endl;}catch(char*){//捕獲字符串異常cout<<“StringException!”<<endl;}return0;}
catch中的形參名可以省略,但類型不能省略#include<iostream>usingnamespacestd;classCException{};//類定義intmain(){intidx;cout<<“Pleaseinputindexvalue:”;cin>>idx;try{//定義異常if(idx==0)throw10;//int型異常elseif(idx==1)throw13.14;//double型異常elseif(idx==2)throw‘c’;//char型異常elseif(idx==3)throwCException();//類異常18.3異常的規則elsethrow“C++”;//字符串異常}catch(int){//捕獲int型異常cout<<“IntException!”<<endl;}catch(double){//捕獲double型異常cout<<“DoubleException!”<<endl;}catch(char){//捕獲char型異常cout<<“CharException!”<<endl;}catch(CException){//捕獲類異常cout<<“ClassException!”<<endl;}return0;}當無匹配的catch進行異常處理時,系統調用默認異常處理程序abort()來終止程序運行。Ch18_06#include<iostream>usingnamespacestd;classCException{};//類定義intmain(){intidx;cout<<“Pleaseinputindexvalue:”;cin>>idx;try{//定義異常if(idx==0)throw10u;//unsignedint型異常elseif(idx==1)throw13.14f;//float型異常elseif(idx==2)throw‘c’;//char型異常elsethrowCException();//類異常}18.3異常的規則catch(int){//捕獲int型異常cout<<“IntException!”<<endl;}catch(double){//捕獲double型異常cout<<“DoubleException!”<<endl;}catch(char){//捕獲char型異常cout<<“CharException!”<<endl;}catch(CException){//捕獲類異常cout<<“ClassException!”<<endl;}return0;}拋擲異常與異常處理程序之間是按數據類型嚴格匹配來捕獲的,不允許類型轉換。Ch18_07#include<iostream>usingnamespacestd;intmain(){doublea,b,result;cout<<“Pleaseinputtwonumbers:”;cin>>a>>b;try{//定義異常if(b==0.0)throwb;//拋擲異常result=a/b;}catch(double){//捕獲、處理異常cout<<“Exceptionofdividingzero!Pleaseinputbagain!”<<endl;cin>>b;result=a/b;}catch(int){cout<<“IntException!”<<endl;}//捕獲、處理異常cout<<“a/b=”<<result<<endl;//catch塊后的語句return0;}18.3異常的規則Ch18_08當catch分程序執行完畢時,則跟隨最后一個catch分程序的代碼就會被執行。#include<iostream>usingnamespacestd;doubledivided(doublea,doubleb){//實現兩個浮點數除法if(b==0.0)throwb;//拋出異常returna/b;}intmain(){try{//定義異常cout<<“13.14/2.0=”<<divided(13.14,2.0)<<endl;cout<<“13.14/0.0=”<<divided(13.14,0.0)<<endl;cout<<“13.14/3.0=”<<divided(13.14,3.0)<<endl;}catch(double){//捕獲異常cout<<“Exceptionofdividingzerooccurs!”<<endl;}return0;}18.3異常的規則可以將拋擲異常與處理異常放在不同的函數中#include<iostream>usingnamespacestd;classCException{};//類定義intmain(){intidx;cout<<“Pleaseinputindexvalue:”;cin>>idx;try{//定義異常if(idx==0)throw10;//int型異常elseif(idx==1)throw13.14;//double型異常elseif(idx==2)throw‘c’;//char型異常elseif(idx==3)throwCException();//類異常elsethrow“Exception”;//字符串異常}18.4默認異常處理catch(int){//捕獲int型異常cout<<“IntException!”<<endl;}catch(double){//捕獲double型異常cout<<“DoubleException!”<<endl;}catch(char){//捕獲char型異常cout<<“CharException!”<<endl;}catch(CException){//捕獲類異常cout<<“ClassException!”<<endl;}catch(…){//捕獲所有其他異常cout<<“UnexpectedException!”<<endl;}return0;}Ch18_09#include<iostream>usingnamespacestd;classFileError{};//異常基類classIncorrectDirectory:publicFileError{};//異常派生類classIncorrectFormat:publicFileError{};//異常派生類classFileCorruption:publicFileError{};//異常派生類intmain(){intexception;cin>>exception;try{//定義異常switch(exception){case1:throwIncorrectDirectory();break;//拋擲派生類異常case2:throwIncorrectFormat();break;//拋擲派生類異常case3:throwFileCorruption();break;//拋擲派生類異常case4:throwFileError();break;//拋擲基類異常default:throw“Unexpected”;break;//拋擲字符串異常}}18.5異常派生族系catch(FileError){//捕獲基類異常cout<<“FileErrorException!”<<endl;}catch(IncorrectDirectory){//捕獲派生類異常cout<<“IncorrectDirectoryException!”<<endl;}catch(IncorrectFormat){//捕獲派生類異常cout<<“IncorrectFormatException!”<<endl;}catch(FileCorruption){//捕獲派生類異常cout<<“FileCorruptionException!”<<endl;}catch(…){//捕獲其他異常cout<<“UnexpectedException!”<<endl;}return0;}18.5異常派生族系Ch18_10為什么無法捕獲派生類異常?拋擲的派生類異常都被基類捕獲了!異常捕獲的規則除了前面所說的,必須嚴格匹配數據類型外,對于類的派生,下列情況可以捕獲異常:異常處理的數據類型是公有基類(public繼承),拋擲異常的數據類型是派生類。異常處理的數據類型是指向公有基類的指針,拋擲異常的數據類型是指向派生類的指針。try{//…thrownewIncorrectDirectory;}catch(FileError*){//…}18.5異常派生族系#include<iostream>usingnamespacestd;classFileError{};//異常基類classIncorrectDirectory:publicFileError{};//異常派生類classIncorrectFormat:publicFileError{};//異常派生類classFileCorruption:publicFileError{};//異常派生類intmain(){intexception;cin>>exception;try{switch(exception){case1:throwIncorrectDirectory();break;//拋擲派生類異常case2:throwIncorrectFormat();break;//拋擲派生類異常case3:throwFileCorruption();break;//拋擲派生類異常case4:throwFileError();break;//拋擲基類異常default:throw“Unexpected”;break;//拋擲字符串異常}}18.5異常派生族系正確異常處理方式catch(IncorrectDirec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年眼鏡清洗機行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年洗發水產業行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年植物園行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年標簽印刷行業市場發展分析及發展趨勢前景預測報告
- 水電工程角色定位試題及答案
- 2025-2030年家居用品產業行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030年安防攝像機產業行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025如何制定租賃合同
- 深入了解中級經濟師考試的就業市場與試題及答案
- 2025-2030年團體健康險行業競爭格局分析及投資前景與戰略規劃研究報告
- 2025年中國光纖市場現狀分析及前景預測報告
- 2025年郵輪旅游市場深度分析報告:產業現狀與未來趨勢預測
- 2025年四川省成都市錦江區中考二診物理試題(含答案)
- (二模)贛州市2025年高三年級適應性考試英語試卷(含答案)
- 曲靖市社區工作者招聘真題2024
- 2024年新疆阿合奇縣事業單位公開招聘村務工作者筆試題帶答案
- 2025-2030中國胃食管反流藥物行業市場發展趨勢與前景展望戰略研究報告
- 2025年建筑集成光伏(BIPV)市場規模分析
- 小學生脫口秀課件
- 抖音陪跑合同協議
- 高三尖子生、邊緣生輔導方案2
評論
0/150
提交評論