C/C++進階學習筆記(三) 異常處理 try catch throw

本節介紹C++裏面的異常處理

歡迎到 我的博客 查看更詳細的內容

throw

throw可以理解爲人爲地拋出自定義的異常類型,可以用於代碼中符合某些條件時刻意地製造一些異常信息拋出給控制檯處理,比如如下例子:

Sales_item item1,item2;
if(!item1.same_isbn(item2))     //當item1和item2的ISBN不同時,拋出異常
    throw runtime_error("Data must refer to same ISBN");
cout << item1 + item2 << endl;

try catch結構

try catch結構用於捕捉程序中會出現的異常,並對異常進行處理

try一下某句代碼會不會有異常,如果有的話catch某種類型的異常,並進行處理

try{
    可能出現異常的語句;
}
catch(異常種類1 異常變量名1){
    處理第一種異常的語句;
}
catch(異常種類2 異常變量名2){
    處理第二種異常的語句;
}

常見的異常種類

異常名 解釋
exception 最常見的問題
runtime_error 運行時的錯誤,只有在運行時才能檢測到
range_error 運行時的錯誤,生成的結果超出了可接受的值域
overflow_error 運行時的錯誤,計算上溢
underflow_error 運行時的錯誤,計算下溢
logic_error 邏輯錯誤,可在運行前檢測到
domain_error 邏輯錯誤,參數的結果值不存在
invalid_argument 邏輯錯誤,不合適的參數
length_error 邏輯錯誤,試圖生成一個超出該類型最大長度的對象
out_of_range 邏輯錯誤,使用一個超出有效範圍的值

實例

// try_catch_throw.cpp : 定義控制檯應用程序的入口點。
//

#include "stdafx.h"
#include <iostream>
#include <bitset>

using namespace std;

int main()
{
    bitset<100> bs; //定義bitset,可以理解爲位數組

    for (size_t index = 0; index != bs.size(); ++index) //用size_t訪問數組位,可以動態地自我改變index的類型,避免訪問不到數組的高位元素
        bs[index] = index;

    //bs.to_ulong();

    try
    {
        bs.to_ulong();      //bs的長度(100)大於ulong能存儲的位數,此處會出現溢出異常
    }
    catch (runtime_error err)   //catch runtime error
    {
        cout << err.what() << endl;
    }

    try
    {
    //throw logic_error("just kidding");
    throw overflow_error("just kidding");       //這裏人爲地拋出異常供後面的語句來catch
    }
    catch (overflow_error err)
    {
        cout << "overflow error" << endl << err.what() << endl;
    }
    catch (logic_error err)
    {
        cout << "logic error" << endl << err.what() << endl;
    }

    system("pause");

    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章