1. 程式人生 > >c++教程(二十三: Exceptions)

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文檔(即

KafkaZK+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對應的儲存目錄