c++教程(二十三: Exceptions)
Exceptions(異常)
Exceptions 異常提供了一種方法來對程式中的異常情況(如執行時錯誤)進行響應,將控制傳遞給稱為handlers處理器的特殊函式。
若要捕獲異常,則在異常檢查下放置一部分程式碼。這是通過在 try-block中封裝程式碼部分來實現的。當異常情況出現在該塊中時,會丟擲異常,將控制轉移到異常處理程式。如果沒有丟擲異常,則程式碼將繼續正常,所有處理程式將被忽略。
通過從try 塊內部使用丟擲關鍵字引發異常。使用關鍵字catch宣告異常處理程式,必須在try 塊之後立即放置:
// exceptions
#include <iostream>
using namespace std;
int main () {
try
{
throw 20;
}
catch (int e)
{
cout << "An exception occurred. Exception Nr. " << e << '\n';
}
return 0;
}
結果為
An exception occurred. Exception Nr. 20
異常處理下的程式碼包含在一個try塊中。在這個例子中,這個程式碼只丟擲一個異常:
throw 20;
throw 表示式接受一個引數(在這種情況下,整型值20),它作為引數傳遞給異常處理程式。
異常處理程式在try塊的結束括號之後立即用catch關鍵字宣告。catch的語法類似於帶有一個引數的正則函式。此引數的型別是非常重要的,因為對throw 表示式傳遞的引數型別進行了檢查,只有在它們匹配的情況下,異常才會被該處理程式捕獲。
多個處理程式(即,多catch表示式)可以被連結;每一個具有不同的引數型別。只執行引數型別與丟擲語句中指定的異常型別相匹配的處理程式。
try {
// code here
}
catch (int param) { cout << "int exception"; }
catch (char param) { cout << "char exception" ; }
catch (...) { cout << "default exception"; }
在這種情況下,最後的處理程式會丟擲的任何異常的型別既不是int也不是 char。
處理程式異常後,執行將在嘗試catch塊後恢復,而不是在丟擲語句之後!。
也可以在更多外部try塊中巢狀try-catch塊。在這些情況下,我們有一個內部catch塊將異常轉發到外部級別的可能性。這是用表示式丟擲,沒有引數。例如:
try {
try {
// code here
}
catch (int n) {
throw;
}
}
catch (...) {
cout << "Exception occurred";
}
Exception specification
舊程式碼可能包含動態異常規範。他們現在在C++不提倡的,但還是支援。一個動態的異常說明如下一個函式宣告,新增一個throw 說明符。例如:
double myfunction (char param) throw (int);
這裡宣告一個函式MyFunction,它帶有一個char型別引數和返回一個double型別的值。如果函式丟擲一些型別不是int,函式呼叫 std::unexpected 而不是尋找一個處理程式或呼叫std::terminate
如果throw說明符是空的型別,這意味著std::unexpected 是被其他外部呼叫。沒有throw說明符函式(的正常功能)不呼叫std::unexpected ,但按照正常的路徑尋找自己的異常處理程式。
int myfunction (int param) throw(); // all exceptions call unexpected
int myfunction (int param); // normal exception handling
標準異常(Standard exceptions)
C++標準庫提供了一個基類用於物件被丟擲的異常。它被稱為std::exception,並在標頭檔案中定義。這個類有一個虛成員函式叫what ,返回一個空終止字元序列(型別為char *),可以覆蓋在派生類中含有某種異常的描述。
// using standard exceptions
#include <iostream>
#include <exception>
using namespace std;
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex;
int main () {
try
{
throw myex;
}
catch (exception& e)
{
cout << e.what() << '\n';
}
return 0;
}
我們放了一個捕獲異常物件的引用(在型別符通知)處理程式,因此這個catch也是exception的派生類,比如myex物件是myexception物件型別。
通過對C++標準庫異常類丟擲異常來自這部分丟擲的異常。這些是:
也從exception派生,標頭檔案定義了兩個泛型異常型別,這些異常型別可以由自定義異常繼承來報告錯誤:
需要檢查的標準異常的一個典型例子是記憶體分配:
// bad_alloc standard exception
#include <iostream>
#include <exception>
using namespace std;
int main () {
try
{
int* myarray= new int[1000];
}
catch (exception& e)
{
cout << "Standard exception: " << e.what() << endl;
}
return 0;
}
通過本例中的異常處理程式捕獲是一個bad_alloc。因為bad_alloc來自標準庫類exception,它能被捕捉到(捕捉參考,捕捉所有相關的類)。
相關推薦
c++教程(二十三: Exceptions)
Exceptions(異常) Exceptions 異常提供了一種方法來對程式中的異常情況(如執行時錯誤)進行響應,將控制傳遞給稱為handlers處理器的特殊函式。 若要捕獲異常,則在異常檢查下放置一部分程式碼。這是通過在 try-block中封裝程式碼部
JavaFX UI控制元件教程(二十三)之Menu
翻譯自 Menu 本章介紹如何建立選單和選單欄,新增選單項,將選單分組,建立子選單以及設定上下文選單。 您可以使用以下JavaFX API類在JavaFX應用程式中構建選單。 選單欄 選單項 選單 CheckMen
Linux C/C++教程(二)-- C++對C的拓展
目錄 一、bool型別關鍵字 二、引用 三、輸入輸出 四、函式引數 五、string類 六、左值 一、bool型別關鍵字 C++在C語言的基礎型別上新增了布林型別(bool),bool可取的值有兩個:true、false,佔
史上最簡單的 MySQL 教程(二十三)「資料的高階操作 之 查詢(上)」
溫馨提示:本系列博文已經同步到 GitHub,地址為「mysql-tutorial」,歡迎感興趣的童鞋Star、Fork,糾錯。 資料的高階操作 查詢資料(上) 基本語法: select + 欄位列表/* + from + 表名 + [whe
C++學習(二十三)(C語言部分)之 指針4
個數字 函數類型 圖片 有意義 大小 堆排 傳參 不能 etc 指針 指針 存放地址 只能存放地址 使用 &取地址運算符 *取值 解引用運算符 malloc 申請堆內存 free釋放堆內存 1.1 指針 存放的地址(變量地址 常量區的地址 堆區內存
NumPy簡明教程(二、陣列2)
NumPy陣列(2、陣列的操作) 基本運算 陣列的算術運算是按元素逐個運算。陣列運算後將建立包含運算結果的新陣列。 >>> a= np.array([20,30,40,50]) >>> b= np.arange( 4) >>
Golang教程:(二十三)緩衝通道和工人池
什麼是緩衝通道上一節我們討論的是基本的無緩衝區的通道,對一個無緩衝的通道進行傳送/寫入和接收/讀取資料是實時阻塞的。事實上我們可以建立一個帶緩衝區的通道,往通道中傳送資料時,只有當緩衝區滿的情況下才會阻塞;類似的,只有我們從通道中讀取資料時,只有讀到緩衝區空為止才會阻塞。帶緩
iptables實用教程(二):管理鏈和策略
否則 命令顯示 accept 目的 number cep 存在 當前 末尾 概念和原理請參考上一篇文章“iptables實用教程(一)”。 本文講解如果管理iptables中的鏈和策略。 下面的代碼格式中,下劃線表示是一個占位符,需要根據實際情況輸入參數,不帶下劃線的表示是
Nginx實用教程(二):配置文件入門
affinity type 服務 源碼編譯 設置時間 shutdown ber 可用 控制指令 Nginx配置文件結構 nginx配置文件由指令(directive)組成,指令分為兩種形式,簡單指令和區塊指令。 一條簡單指令由指令名、參數和結尾的分號(;)組成,例如:
Git 教程(二):時光穿梭
rac call 替換 img posit key 誤刪 ranch 定位在 我們已經成功地添加並提交了一個readme.txt文件,現在,是時候繼續工作了,於是,我們繼續修改readme.txt文件,改成如下內容: Git is a distributed version
C#編程(二十三)----------實現繼承
一點 more 希望 否則 產生 無法 概念 類的方法 將不 原文鏈接:http://blog.csdn.net/shanyongxu/article/details/46593809 如果要聲明派生自另一個類的一個類,可以使用下面的語法: class DerivedC
C語言(二):C語言概述
感覺 用途 計算機 一行 可用 讓其 pan 復合語句 sso 學習筆記: 運算符 函數 一個簡單的C語言程序 整型變量 換行符 註釋 關鍵字 概述:C語言程序是什麽樣
Java學習筆記(二十三):final關鍵字
類繼承 ron 滿足 單詞 靜態 bsp 條件 str 進行 final關鍵字有三種使用場景: final修飾類 final修飾方法 final修飾變量 final修飾的類,不能再有子類繼承。 只要滿足以下條件就可以把一個類設計為final類: 不是專門為繼承而設
web全棧學習教程(二):本系列教程介紹
系列教程 trap soft 切圖 think html4 style pes html 一、發布周期 計劃2-3天發一篇,半年左右完成。 二、教程大綱 web全棧介紹與優勢分析 本系列教程介紹 切圖與圖片介紹 html4.01 html5 css2.0 css3 頁面布
mybatis教程(二):概念總結
return 單個 其它 array author 擴展 地址 caf eal 一、註意規範 註意:(1).XXXmapper.xml 文件中的 namespace 等於mapper 接口地址 (2).XXXmapper.java 接口中的方法輸入參數
Java學習總結(二十三)——前端:HTML基本標簽的使用
water 默認值 right 列表框 信息工程 area led mea MF 一.HTML概述1.HTML:(Hyper Text Markup Language)超文本標記語言,是一種專門用於創建Web超文本文檔的編程語言,它能告訴Web瀏覽程序如何顯示Web文檔(即
Kafka:ZK+Kafka+Spark Streaming集群環境搭建(二十三)Structured Streaming遇到問題:Set(TopicName-0) are gone. Some data may have been missed
ack loss set div top 過程 pan check use 事情經過:之前該topic(M_A)已經存在,而且正常消費了一段時間,後來刪除了topic(M_A),重新創建了topic(M-B),程序使用新創建的topic(M-B)進行實時統計操作,執行過程中
通證經濟大局觀(二十三):部落與技術進步
既然我們是以組織和協作模式的角度來聊通證經濟體,且丟擲了一個大結論:通證經濟體將超越公司和國家,成為歷史的必然。那麼,就有必要循著人類組織和協作模式的演化長河,溯流而下,試看“通證經濟體”是否沿途必經的高山峽谷。 在大自然的進化中,有兩種方向,一種是個體越來越強,比如老虎的凶猛、豹子的速度、老鷹
java基礎學習總結(二十三):什麼要使用AOP
從最基礎的原始程式碼-->使用設計模式(裝飾器模式與代理)-->使用AOP三個層次來講解一下為什麼我們要使用AOP。 原始程式碼的寫法 既然要通過程式碼來演示,那必須要有例子,這裡我的例子為: 有一個介面Dao有insert、delete、update三個方法,在insert
大資料(二十三):hive優化、表優化
一、Fetch抓取 Fetch抓取是指,Hive中對某些情況的查詢可以不必使用MapReduce計算。例如,select * from employees;在這種情況下,Hive可以簡單讀取employee對應的儲存目錄