国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

c++教程(二十三: Exceptions)

2019-11-11 00:14:55
字體:
來源:轉載
供稿:網友

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 unexpectedint 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,它能被捕捉到(捕捉參考,捕捉所有相關的類)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 尚义县| 泰和县| 叙永县| 舞阳县| 耒阳市| 凤山县| 丘北县| 阳山县| 云安县| 沙雅县| 东光县| 东乌珠穆沁旗| 筠连县| 水富县| 富平县| 内乡县| 嵊泗县| 遵化市| 微博| 长宁县| 鄂温| 亳州市| 黄大仙区| 西乡县| 屏东市| 南汇区| 珠海市| 城固县| 桂东县| 阳江市| 平潭县| 宽甸| 百色市| 奎屯市| 托里县| 西峡县| 镇巴县| 黔西县| 阿瓦提县| 锡林郭勒盟| 子洲县|