本節介紹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;
}