1. 程式人生 > 實用技巧 >Delta函式,C++的異常捕捉,以及矩陣求導等一些碎碎唸的概念

Delta函式,C++的異常捕捉,以及矩陣求導等一些碎碎唸的概念

1.Delta函式:

簡而言之就是除了0處取1其他地方都取0的函式,嚴格來講它並不是函式啊。。

2.矩陣求導等一些公式:

https://blog.csdn.net/a493823882/article/details/81324037

3.C++異常捕捉

C++之異常捕獲和處理

一、簡介

  在C++語言中,異常處理包括:throw表示式try語句塊一套異常類。其中,異常類用於在throw表示式和相關的catch子句之間傳遞異常的具體資訊。exception標頭檔案定義了最普通的異常類exception,它只報告異常的發生,不提供任何額外資訊。以下是定義在stdexcept標頭檔案中的常用的異常類:

異常類解釋
exception 最常見的問題
runtime_error 只有在執行時才能檢測出的問題
range_error 執行時錯誤:生成的結果超出了有意義的值域範圍
overflow_error 執行時錯誤:計算上溢
underflow_error 執行時錯誤:計算下溢
logic_error 程式邏輯錯誤
domain_error 邏輯錯誤:引數對應的結果值不存在
invalid_argument 邏輯錯誤:引數無效
length_error 邏輯錯誤:試圖建立一個超過該型別最大長度的物件
out_of_range 邏輯錯誤:使用一個超出有效範圍的值

  異常類只定義了一個名為what的成員函式,該函式沒有任何引數,返回值是一個指向C風格字串的const char*。

二、基本用法

  直接貼程式碼,簡單測試一下:

#include <stdexcept>
#include <iostream>

using namespace std;

void test() {
    throw runtime_error("just for test!");
}

int main() {
    try {
        test();
    } catch(runtime_error err) {
        cout << err.what() << endl;
    }
    return 0;
}

/*
* 執行的結果不出意料,便是:just for test!
* 可以有多個catch語句塊
* 找到了匹配的runtime_error便執行相應的catch語句塊程式碼
*/

注意:當執行一個throw時,跟在throw後面的語句將不再被執行。且只有在catch語句塊中可以使用throw;這樣的語句,表示當前的catch語句不足與完整地處理好這個異常,於是決定由更上一層的函式接著處理。

三、noexcept

  概括來說,這個關鍵字有兩種用法:作為函式限定符,作為一個一元運算子返回一個bool型別的右值常量表達式。

  第一個用法中,noexcept放在函式的後面,一般而言,對於成員函式來說,放在const後面,而放在final、override或虛擬函式的=0之前。其表示該函式不會丟擲異常,但如下情況也可以順利編譯:

void f() noexcept {
    throw exception();
}

  需要注意的是,函式指標及該函式指向的函式必須具有一致性的異常說明,如下:

void (*pf1)(int) noexcept;

void f() noexcept {}
void t() {}

pf1 = f; //正確,因為f能保證不丟擲異常
pfi = t; //錯誤,因為t不能保證

  第二個用法中,可以如下使用:

noexcept(f()) //若f保證不丟擲異常,則返回true

//一個常用用法,等價於void t() {}
void t() noexcept(false) {}

//以下保證f和g的異常型別一致
void f() noexcept(noexcept(g()));

四、定義自己的異常類

  假設你想設計一個異常類,名為test_error,其的效果和runtime_error一樣,可以用如下程式碼:

class test_error : public runtime_error {
public:
    explicit test_error(const string &s):
                    runtime_error(s) {}
};