學習筆記 函式預設拋例外嗎

2021-06-25 17:25:18 字數 873 閱讀 2070

一些特殊的函式,例如析構函式,是預設noexcept(true)。所以在寫析構函式時,不用畫蛇添足的寫 ~t() noexcept(true) ,直接~t(){}即可

大多數的函式都是預設拋例外的。當看到乙個 void foo(); 時,要認為它實際是void foo() noexcept(false); 

從想當然的角度看,原先的c函式例如 strcpy()等是不可能拋例外的,因為c語言誕生時exception機制根本不存在,所以不可能在strcpy裡跑出乙個鬼例外出來。

函式預設為不拋例外,也是貌似可行的。可惜還要用邏輯推理一下,不能想當然。

首先,用c++仍然可以寫出c風格的**,這些用extern "c" 包裹的**,名義上是c**,實際只是在介面上是c風格的,骨子裡沒有禁止c++的東西,還是可以寫出throw。

其次,根據noexcept規定,既然保證了不拋例外,實際在執行中違反規定的,一律std::terminate()。這一點足以說明問題。我們的大量寫的函式都是光著屁股的(意思是 void foo () ;後面沒有任何noexcept等修飾符),而void foo() 這種**到處都是,規定預設不拋例外就是睜眼瞎拍屁股做出的政策。不能為了推出新政策,讓廣大程式設計師改**去吧?所以用反證法一琢磨,就應該認為預設是拋例外的(特殊如析構函式除外)。

那麼怎麼去看待strcpy()預設可以拋例外這樣的滑稽的事情呢? 比如,乙個函式可以拋std::bad_alloc例外,可是有誰在實際中見過這個例外呢?我是從沒見過。因為程式寫的好,記憶體也充足,電腦也每天都重啟,不是故意的拋這個例外給自己看,從沒「實際」的看見過。同理,strcpy()是可以拋例外的,這不意味著它必須拋例外,這要簡單的認為strcpy自己很自覺,給它個權力都關進籠子裡,人家不屑於拋例外。

PL SQL 學習筆記 (13)例外之自定義例外

自定義例外 定義變數,型別是 exception 使用raise拋出自定義例外。例子 查詢50號部門的員工姓名 1 自定義例外 查詢50號部門的員工姓名 2set serveroutput on34 declare5 定義游標,代表50號部門的員工姓名 6cursor cemp is select ...

C 學習筆記之建構函式(一)預設建構函式

定義 在未提供顯式的初始值時,用來建立物件的建構函式。舉例 class testclass private int m a int m b public testclass 預設建構函式1 testclass int a,int b 建構函式 testclass int a 10,int b 5 預...

c 學習 預設建構函式

預設建構函式 default constructor 就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有的 形參提供預設 實參的建構函式定義。如果定義某個類的變數時沒有提供初始化時就會使用預設建構函式。中文名預設建構函式 外文名default constructor 涉及...