C++錯誤和異常處理

張雁宇發表於2018-12-18

錯誤處理利用庫函式(strerror())

#include <iostream>
#include <errno.h>
#include <string.h>
using namespace std;

int main()
{
    for(int i = 0; i < 140; ++i)
    {
        errno = i;
        cout << "errno" << i << ":" << strerror(errno) << endl;
    }
    return 0;
}

 執行結果:

C 庫函式 char *strerror(int errnum) 從內部陣列中搜尋錯誤號 errnum,並返回一個指向錯誤訊息字串的指標。strerror 生成的錯誤字串取決於開發平臺和編譯器。

宣告

char *strerror(int errnum)

引數

errnum -- 錯誤號,通常是 errno

返回值

該函式返回一個指向錯誤字串的指標,該錯誤字串描述了錯誤 errnum。

執行錯誤判斷: 

#include <iostream>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
using namespace std;

int main()
{
    int ret =  close(10);

    if(ret  == -1)
    {
        fprintf(stderr,"close error with message :%s,errno =  %d\n", strerror(errno), errno);
    }
    return 0;
}

 執行結果

 在系統程式設計中通常通過函式返回值來表示錯誤(一般-1代表函式執行出錯),並通過特殊變數errno來描述。

異常處理:

異常處理是一種允許兩個獨立開發的程式元件在程式執行期間遇到程式不正常的情況(異常(exception))時,相互通訊的機制。

丟擲異常:

異常是程式可能檢測到的,執行時刻不正常的情況。如被0除,陣列越界或空閒儲存記憶體耗盡。異常存在於程式正常函式之外,要求程式立刻處理。

C++程式中出現異常時,檢測到異常的資料段可以通過產生或者丟擲異常來通知異常發生在這裡。

在 C++中 異常往往用類 class 來實現;

丟擲異常通過throw表示式來實現,異常往往丟擲class型別的物件,throw表示式可以丟擲任何型別的物件

try塊:必須包圍能夠丟擲異常的語句。try 塊以關鍵字 try 開始 後面是花括號括起來的語句序列 在 try 塊之後是一組處理程式碼 被稱為 catch 子句。

當某條語句丟擲異常時 跟在該語句後面的語句將被跳過 程式執行權被轉交給處理異常的 catch 子句 如果沒有 catch 子句能夠處理該異常 則程式執行權又將被轉交給 C++標準庫中定義的函式 terminate()。

try 塊可以包含任何 C++語句——表示式以及宣告 一個 try 塊引入一個區域性域 在 try塊內宣告的變數不能在 try 塊外被引用 包括在 catch 子句中。

捕獲異常:

C++異常處理程式碼是 catch 子句 catch clause 當一個異常被 try 塊中的語句丟擲時系統通過檢視跟在 try 塊後面的 catch 子句列表 來查詢能夠處理該異常的 catch 子句。
一個 catch 子句由三部分構成 關鍵字 catch 在括號中的單個型別或單個物件宣告被稱作異常宣告 exception declaration 以及複合語句中的一組語句 如果選擇了一個 catch 子句來處理一個異常 則執行相應的複合語句。
C++的異常處理機制被稱為是不可恢復的 nonresumptive 一旦異常被處理 程式的執行就不能夠在異常被丟擲的地方繼續
 

相關文章