【C++基礎】異常處理機制概要

目錄

    • C++的異常處理方法知識要點
    • 踹扔抓的代碼塊示例
    • 兩種處理被0除的方法
    • 異常處理機制的優點
    • 其他語言中的異常處理
    • C++函數異常聲明

C++的異常處理方法知識要點

理解“踹扔抓”三部曲的結構,尤其是catch是怎么匹配異常的。

知道C++標準庫中的異常類都是從exception繼承下來的,并且支持 what() 這個操作

了解logic_error、runtime_error等一些常見的異常類的大致含義,以便于我們自己寫異常類的時候拿來繼承

理解多個catch語句的匹配原則,尤其是對于繼承鏈上的異常類型,哪個在前哪個在后必須做到心里有數

掌握異常傳播的原理:異常如果在當前函數中沒有被捕獲,它就會被拋向當前函數的調用者;拋異常的語句后面的語句都會被跳過,直到遇到對應的catch

踹扔抓的代碼塊示例

try{code to try;throw an exception (1)with a throw statement(2) or from functionMore code to try;
}
catch(type e){Code to process the exception;
}

兩種處理被0除的方法

(1) use if statement (使用if語句)
(2) use exception handling (使用異常處理)

下面是使用異常處理的程序,如果除數是0,那么會拋出number1;執行throw語句之后, 緊隨其后的 cout 語句就會被跳過;
如果能夠抓住number1,那么就會進行處理,不會出現程序出錯。
如果type不匹配,就會抓不住,程序會崩潰。

int main() {// Read two intergerscout << "Enter two integers: ";int number1, number2;cin >> number1 >> number2;try {if (number2 == 0)throw number1;cout << number1 << " / " << number2 <<" is "  << (number1 / number2) << endl;}catch (int e) {cout << "Exception: an integer " << e <<" cannot be divided by zero" << endl;}cout << "Execution continues ..." << endl;
}

異常處理機制的優點

可將異常信息從被調函數帶回給主調函數。異常處理實際上是對程序執行流程的控制

如下例:在quotient里面遇到異常,將異常扔出而不對異常進行處理,問題交由主調函數main來處理。從而將異常的發現與處理分開。

//用異常處理
int quotient(int number1, int number2) {if (number2 == 0) throw number1; return number1 / number2;
} 
int main() {try {int x = quotient(1, 0);} catch (int) {std::cout << "除數為0!";}
}

若不用異常處理:quotient()如何告訴 main() “number2 有問題”?
我們可以從返回值和傳引用的角度思考,但是若是函數嵌套調用,該如何將異常信息帶回給主調函數

(1) 用返回值?
·f(number2 == 0) return x; //x應該是0還是1?
(2) 用指針/引用類型的參數?然后再主函數去查看這個參數,但是不優雅。
int quotient(int n1, int n2, int &s){ if(n2 == 0) s=-1; //求商,函數要3個參數? }
(3) 如果采用 f(g(h(quotient(x,y))));怎樣將錯誤從quotient() 傳到 f()?若是使用(2),難道要在每個函數加上一個引用類型的參數來讓主調函數查詢是否出現異常嗎?
顯然,在這種情況下用異常處理更加簡潔

其他語言中的異常處理

python中:

try:代碼raise xxx拋出異常
except:錯誤時執行
else:沒有錯誤時執行
finally無論如何都執行 

關于java與C++:
在C++中,你可以拋出任何類型的異常。(c++可以拋出任何類型,,java中這樣是不行的).
Java的函數異常聲明是在編譯時刻檢查的,所以如果是java任何調用abc函數的其他函數,java虛擬機會強迫那些調用abc函數的其他函數處理matherr, error這些異常。
而C++編譯在時候,對這些調用 以聲明會拋出異常函數 的其他函數,不會強制他們處理這些可能會拋出的異常。

C++函數異常聲明

1、在函數參數列表后聲明可能會拋出的異常:
C++從某個年代就開始,在函數的后面加上“:”+ throw+“()”,圓括號內有1個或多個異常類,多個用逗號分割。
void abc( int a ) : throw ( matherr, error) {…}
這是告訴別的程序,在abc函數的運行時刻,最多可以拋出圓括號里的哪些個異常類。
2、函數后聲明可能拋出的異常 的 意思:
當前函數運行時刻有可能會拋出的異常,但是保證不會拋出圓括號內matherr, error以外的其他異常。

C++函數異常聲明,不是用來約束那些調用聲明可能會拋出異常abc函數 的其他函數。不是約束其他函數 調用abc 就必須處理matherr, error這些異常。而是用來約束abc函數本身的行為。abc 函數聲明會拋出matherr, error這些異常,如果abc函數運行時拋出了除了matherr, error以外的異常,程序會拋出unexpected(想不到/未知的)異常然后程序終止。
·C++函數后聲明/不聲明異常:

·1、void abc( int a ) {…} //普通函數

普通函數表示可以拋出任何異常

·2、void abc( int a ):throw() {…} // 不拋異常的函數

函數參數后 throw(),圓括號內沒有任何東西,表示這個函數承諾不會拋出任何異常!

·3、void abc( int a ):throw(matherr) {…} //函數會拋出matherr

函數參數后 throw(),圓括號有matherr,表示運行時會有一個機制檢驗這個函數是否真的,只拋出了列表里的matherr異常。

·區別與Java函數后聲明/不聲明異常:

·1、void abc( int a ) {…} //普通函數

普通函數表示不拋出任何異常

·2、void abc( int a ) throw(exception) {…} // 拋出任何異常 函數參數后
throw(),圓括號內有exception,表示這個函數會拋出任何異常!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377428.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉載]Struts2 獲得Session和Request

轉自http://www.blogjava.net/lyyb2001/archive/2008/03/07/184593.html 在struts1中&#xff0c;獲得到系統的request或者session對象非常方便&#xff0c;都是按照形參傳遞的&#xff0c;但是在struts2中&#xff0c;request和session都被隱藏了struts提供兩種方式訪問sessio…

WPS根據章節編號依次排序

第Ⅲ章節有四小部分&#xff0c;分別為A、B、C、D 第Ⅳ章節要重新開始編號&#xff0c;從A開始 操作步驟&#xff1a; ①再D后面回車&#xff08;紅線位置回車&#xff09;&#xff0c;生成E ②把Ⅳ中待寫內容寫到E中 ③將E復制到Ⅳ下&#xff0c;這里需要注意D的換行也要復制…

【C++基礎】異常匹配與內建異常類

目錄異常匹配catch: 按異常類型匹配為何要使用異常類內建異常類標準庫中的異常基類標準庫中的異常類例1&#xff1a;vector下標訪問越界out_of_range異常例2&#xff1a;內存分配失敗bad_alloc異常例3&#xff1a;側向轉換失敗bad_cast異常類幾種情況&#xff0c;使用對應異常異…

scala 訪問修飾符_Scala中的訪問修飾符

scala 訪問修飾符Access modifiers are used in order to restrict the usage of a member function to a class or a package. Using access modifiers data hiding takes place which is a very important concept of OOPs. 訪問修飾符用于將成員函數的使用限制為類或包。 使…

小試---EF5.0入門實例1

現在做個小練習吧~~~ 第一步&#xff1a;首先新建一個數據庫名字為Test;數據庫里面只有一個表UserTable 腳本為&#xff1a; USE [master] GO /****** 對象: Database [Test] 腳本日期: 12/15/2013 18:51:54 ******/ CREATE DATABASE [Test] ON PRIMARY ( NAME NTest, F…

iScroll4 禁止select等頁面元素默認事件的解決方法 轉

iScroll4 禁止select等頁面元素默認事件的解決方法起因在于onBeforeScrollStart : function(e){ e.preventDefault(); },這一行&#xff0c;iSroll禁止了事件的默認行為&#xff0c;導致select&#xff0c;option&#xff0c;textarea等元素無法點擊。解決方法也很簡單&#xf…

C++中比較兩個浮點數是否相等

來源&#xff1a; https://stackoverflow.com/a/37686/3242645 代碼&#xff1a; #include <cmath> #include <limits> bool AreSame(double a, double b) {return std::fabs(a - b) < std::numeric_limits<double>::epsilon(); }

MPEG的完整形式是什么?

MPEG&#xff1a;運動圖像專家組 (MPEG: Moving Picture Experts Group) MPEG is an abbreviation of Moving Picture Experts Group. It is a working group of authorities that is founded to establish standards for audio and video compression and transmission. The a…

正則 去除html標記

//string regexstr "<[^>]*>"; //去除所有的標簽 //"<script[^>]*?>.*?</script>" //去除所有腳本&#xff0c;中間部分也刪除 // string regexstr "<img[^>]*>"; //去除圖片的正則 // string regexstr &…

自畫PopMenu彈出

BorderColor:TColor; //邊框顏色FillColor:TColor; //未選中填充顏色TextColor:TColor; //未選中字體顏色SelectTextColor:TColor; //選中字體顏色SelectFillColor:TColor; //選中填充顏色SideBuffer:Integer; //邊框寬度procedure TForm1.FormCreate(Sender: TObject); b…

安利一款倒計時插件---雨滴桌面

內容來自B站(搜索Rainmeter即可)&#xff0c;里面教程很多&#xff0c;因為視頻看的有點麻煩&#xff0c;故進行了整理 一、下載安裝包、解壓、安裝 免費下載連接&#xff0c;不需要積分 skin文件夾存放皮膚的一些配置文件&#xff0c;因為原本皮膚太low了 第二個是可執行文…

【C++基礎】自定義異常類與多重捕獲

目錄自定義異常類構建過程例&#xff1a;Vec3D類的數組下標越界的異常類捕獲多種無關異常不同的異常的捕獲捕獲派生異常異常處理的次序例子&#xff1a;多重捕獲異常類catch塊的參數類型可以不用引用類型嗎?自定義異常類 自定義異常類通常由exception或其后代類派生。這樣我們…

gprs 睡眠模式_GPRS的完整形式是什么?

gprs 睡眠模式GPRS&#xff1a;通用分組無線業務 (GPRS: General Packet Radio Service) GPRS is an abbreviation of General Packet Radio Service. It is a non-voice, high-level speed packet switching technology planned for GSM networks. On 2G and 3G cellular tran…

int main(int argc,char* argv[])講解

分類&#xff1a; 學習筆記2011-11-07 21:502354人閱讀評論(0)收藏舉報dos編譯器pathunixcommandc在最近學習中老是遇到 int main(int argc,char* argv[])&#xff0c;以為就是簡單的參數應用了&#xff0c;但是看代碼是沒能理解參數的具體傳遞過程&#xff0c;上網…

Maven實戰(七)——常用Maven插件介紹(上)

我們都知道Maven本質上是一個插件框架&#xff0c;它的核心并不執行任何具體的構建任務&#xff0c;所有這些任務都交給插件來完成&#xff0c;例如編譯源代碼是由maven-compiler-plugin完成的。進一步說&#xff0c;每個任務對應了一個插件目標&#xff08;goal&#xff09;&a…

【設計模式之美】<Reading Notes>抽象類與接口

抽象類特性 1、抽象類不允許被實例化&#xff0c;只能被繼承。 2、抽象類可以包含屬性和方法。方法既可以包含代碼實現&#xff0c;也可以不包含代碼實現。不包含代碼實現的方法叫做抽象方法。 3、子類繼承抽象類&#xff0c;必須實現抽象類中的所有抽象方法。 接口特性 1、…

多線程之間共享數據的實現

1&#xff1a;如果每個線程執行的代碼相同&#xff0c;可以使用同一個Runnable對象&#xff0c;然后將共享的數據放在Runnable里面&#xff0c;來實現數據的共享。 例如買票系統... package com.cn.gbx;import java.util.Date; import java.util.Random; import java.util.Time…

AIX的完整形式是什么?

AIX&#xff1a;高級交互式主管 (AIX: Advanced Interactive Executive) AIX is an abbreviation of "Advanced Interactive Executive". AIX是“ Advanced Interactive Executive”的縮寫 。 It is a progression sequence of proprietary UNIX operating systems …

c#生成隨機字符串 用做批量申請賬號時的隨機密碼還是相當不錯的

//隨機字符串生成器的主要功能如下&#xff1a; //1、支持自定義字符串長度 //2、支持自定義是否包含數字 //3、支持自定義是否包含小寫字母 //4、支持自定義是否包含大寫字母 //5、支持自定義是否包含特殊符號 //6、支持自定義字符…

【C++基礎】C++11的noexcept聲明符 與 異常傳播

目錄C noexcept&#xff1a;1、用途2、用法1、noexcept聲明符的用法&#xff1a;2、noexcept運算符的用法異常傳播1、異常傳播的定義2、異常傳播中的規則3、異常傳播的代價C noexcept&#xff1a; 1、用途 C11使用noexcept指明函數是否拋出異常&#xff1a; 若函數不拋異常&a…