1. 程式人生 > >函式後面加throw關鍵字的含義

函式後面加throw關鍵字的含義

1、對throw的說明

C++函式後面後加關鍵字throw(something)限制,是對這個函式的異常安全性作出限制。

舉例及解釋如下:
void fun() throw() 表示fun不允許丟擲任何異常,即fun是異常安全的。
void fun() throw(...) 表示fun可以丟擲任何形式的異常。
void fun() throw(exceptionType) 表示fun只能丟擲exceptionType型別的異常。
比如:
void GetTag() throw(int); 表示只丟擲int型別異常
void GetTag() throw(int,char); 表示丟擲in,char型別異常
void GetTag() throw(); 表示不會丟擲任何型別異常
void GetTag() throw(...); 表示丟擲任何型別異常
那麼,void GetTag() throw(int); 表示只丟擲int型別異常  這句解釋怎麼理解呢?並不表示一定會丟擲異常,但是一旦丟擲異常只會丟擲int型別。如果丟擲非int型別異常,呼叫unexsetpion()函式,退出程式。

2、異常丟擲後的處理

函式宣告和定義後的throw表示式是異常規範(exception specification),保證這個函式只應該丟擲指定型別的異常,如果違反則在執行期呼叫std::unexpected()。如果異常規範允許丟擲std::bad_exception,則標準庫實現會在std::unexpected中丟擲一個由實現定義的std::bad_exception物件;否則呼叫std::terminate()——預設行為是程式異常中止,類似於std::abort()。通過std::set_unexpected和std::set_terminate可以改變預設行為。因為是執行期動態判斷的,可能會有效能問題,並且如果異常沒catch好可能直接使程式掛掉,這項特性被普遍認為是個雞肋。C++11支援靜態的noexcept異常規範,不過現在的編譯器大多沒實現。我的做法是用巨集來表示動態異常規範的throw關鍵字,在Debug版本中使用,在Release版本中定義為空。
關於丟擲的異常物件的生存期,簡單點說是到最後一個catch到異常的handler,或者沒被catch就是到整個程式結束了。反正不是靜態確定的,不會在全域性區(編譯器也不會傻到只在一個函式裡用的東西在整個程式生存期裡佔著茅坑不拉屎)。至於丟擲物件型別嘛……catch總比判斷字串寫起來省力吧?要捕獲所有型別的話直接catch(...)就行了。

相關推薦

函式後面throw關鍵字含義

1、對throw的說明 C++函式後面後加關鍵字throw(something)限制,是對這個函式的異常安全性作出限制。 舉例及解釋如下: void fun() throw() 表示fun不允許丟擲任何異常,即fun是異常安全的。 void fun() throw(...)

c++成員函式後面一個冒號的含義

轉載自:https://zhidao.baidu.com/question/2010930169328038188.html 冒號後面跟的是賦值,這種寫法是C++的特性。 A( int aa, int bb ):a(aa),b(bb) { } 相當於 A( int aa,

建構函式後面冒號,這傻逼玩意,有病吧

簡單的講:冒號後面跟的是賦值,這種寫法是C++的特性。這麻痺特性有毛病。。。A( int aa, int bb ):a(aa),b(bb) { } 相當於 A( int aa, int bb ) { a=aa; b=bb; }   來一段經典程式碼: #include &l

C++函式後面const

非靜態成員函式後面加const(加到非成員函式或靜態成員後面會產生編譯錯誤),表示成員函式隱含傳入的this指標為const指標,決定了在該成員函式中,任意修改它所在的類的成員的操作都是不允許的(因為隱含了對this指標的const引用);唯一的例外是對於mutable修飾的成員。加了const

C\C++中函式後面const

c++ 在函式後加const的意義:    我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是"只讀"函式,而有一些函式要修改類資料成員的值。如果把不改變資料成員的函式都加上const關鍵字進行標識,顯然,可提高程式的可讀性。其實,它還能提高程式的可靠性,

C++子類的建構函式後面:冒號的作用

在C++類的建構函式中經常會看到如下格式的寫法: MyWindow::MyWindow(QWidget* parent , Qt::WindowFlags flag) : QMainWindow(pa

C\C++中函式後面const修飾

        我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是"只讀"函式,而有一些函式要修改類資料成員的值。如果把不改變資料成員的函式都加上const關鍵字進行標識,顯然,可提高程式的可讀性。其實,它還能提高程式的可靠性,已定義成con

成員函式後面const,沒有const,以及使用的區別

函式後面加const編譯器會自動給每一個函式加一個this指標。在一個類的函式後面加上const後,就表明這個函式是不能改變類的成員變數的(加了mutable修飾的除外,後面有講)。實際上,也就是對這個this指標加上了const修飾。#include <iostrea

< C++ > initializer list 初始化列表(建構函式後面個冒號的解釋)

Keypoint : 呼叫父類的建構函式(一般為有參建構函式),初始化類中的成員。 C++ primer 5th edition: Remember When creating an object of a derived class, a program first

解構函式virtual關鍵字的作用?

大家知道,解構函式是為了在物件不被使用之後釋放它的資源,虛擬函式是為了實現多型。那麼把解構函式宣告為vitual有什麼作用呢?請看下面的程式碼:#include<iostream> usi

C++函式後面const修飾

給隱含的this指標加const,表示這個this指向的東西是const的,也就是說這個函式中無法改動資料成員了。const是一種保證,告訴你這個成員不會改變物件的狀態。 宣告一個成員函式的時候用const關鍵字是用來說明這個函式是 “只讀(read-only

C\C++學習--函式後面const

https://blog.csdn.net/smf0504/article/details/52311207c++ 在函式後加const的意義:    我們定義的類的成員函式中,常常有一些成員函式不改變類的資料成員,也就是說,這些函式是"只讀"函式,而有一些函式要修改類資料成

$ 後面特殊字符的含義

其他 nbsp brush $* 進程id pid 使用 $0 上一個 說法一$? 上一條命令執行後返回的狀態 $# 參數的數量 $* 所有參數的內容 $$ 當前進程的進程號 $! 後臺運行的最後一個進程號 $0 當前執行的進程名 $n 第n個參數值,n=1..9 $@ 跟

python學習第七天 基礎數據類型補充 深淺copy 集合 關鍵字後面可叠代對象

div ext split() 不可變 append 鍵值對 port [] 賦值 在基礎數據類型中可能遇到的坑:   元組:     tuple1=(1) 的數據類型是int , tuple2=(‘alex‘)的數據類型是str 等     tuple1=(1,) 和 t

一個函式後面const表示什麼意思?

const用在成員函式後 主要是針對類的const 物件 如: class Text{ public: void printconst(void)const{cout<<"hello"<<endl;} void print(void)

定義函式時,後面const意義

 const物件只能呼叫const成員函式。  const物件的值不能被修改,在const成員函式中修改const物件資料成員的值是語法錯誤  在const函式中呼叫非const成員函式是語法錯誤 任何不會修改資料成員的函式都應該宣告為const型別。如果在編寫const

php靜態變量理解----(變量前面添static關鍵字

使用方式 ron clas ech eight 全局 add .com echo   php中除了常規類和方法的使用,訪問控制之外,還有靜態關鍵字static,靜態變量可以是局部變量也可以是全局變量,當一個程序段執行完畢時,靜態變量並沒有消失,它依然存在於內存中,下次在定義

在函數中修改全局變量的值,需要global關鍵字

結果 輸出 新的 都是 def 存在 before tro 分享 一、引用 使用到的全局變量只是作為引用,不在函數中修改它的值的話,不需要加global關鍵字。如: #! /usr/bin/python a = 1 b = [2, 3] def func():

mybatis:延遲載時不要在get/set方法上面添final關鍵字(原創)

沒有 tle lan nco odin .com 延遲加載 apache 被調用 1.mybatis-config.xml:<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration

java中拋出throw關鍵字是怎麽用的? 舉例?

gin 物理 let 決定 download 崩潰 一個 string 怎麽 5.拋出throw關鍵字 (視頻下載) (全部書籍) 馬克-to-win:我們先說5/0的原理,當程序運行到5/0的時候,java系統JVM會在後臺new出一個除0異常實例,之後把這個實例傳入