40、不一樣的C++系列--函式異常宣告
阿新 • • 發佈:2019-01-09
函式異常宣告
首先來看一段程式碼:
#include <iostream>
#include <string>
using namespace std;
int func(int i, int j) throw(int, char)
{
if( (0 < j) && (j < 10) )
{
return (i + j);
}
else
{
throw '0';
}
}
void test(int i) try
{
cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int j)
{
cout << "Exception: " << j << endl;
}
catch(...)
{
cout << "Exception..." << endl;
}
int main(int argc, char *argv[])
{
test(5);
test(10);
return 0;
}
請問這段程式碼 void test(int i)
和 in func(int i, int j)
int func(int i, int j)
後面跟個 throw(int, char)
,而在 void test(int i)
後面跟著 try ... catch...
語句塊呢?
其實這裡有一個新的知識點: 函式異常宣告
。
- try … catch … 用於分隔正常功能程式碼和異常處理程式碼
- try … catch … 可以直接將函式實現分隔為2部分
- 函式宣告和定義時可以直接指定可能丟擲的異常型別
- 異常宣告稱為函式的一部分可以提高程式碼可讀性
所以在上述那段程式碼裡:
int func(int i, int j) throw (int, char)
{
if( (0 < j) && (j < 10) )
{
return (i + j);
}
else
{
throw '0';
}
}
int func()函式
後面指定了可能丟擲的異常型別為 int 和 char 型別,也就是說func函式體在執行過程中可能會丟擲int型別或者char型別的異常。
void test(int i) try
{
cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int j)
{
cout << "Exception: " << j << endl;
}
catch(...)
{
cout << "Exception..." << endl;
}
而在 test()函式
中,使用了try … catch …語句塊把正常程式碼和異常程式碼分隔開,當正常程式碼在執行過程中,無法繼續往下執行,就會丟擲事先宣告好的異常,然後 catch語句塊中進行捕獲。而catch語句塊已經事先宣告好資料型別,所以捕獲異常資料時,根據異常資料型別來判斷執行那段catch語句,如果沒有匹配上,就會執行引數為 ...
的catch語句,它程式碼任意型別。
由於這裡丟擲了 char型別 的 ‘0’,所以會執行最後一個catch語句塊。
最後給出上述程式碼的執行結果:
func(i, i) = 10
func(i, i) = Exception...
接下來給出幾個注意事項:
- 函式異常宣告時一種與編譯器之間的契約
- 函式宣告異常後就只能丟擲宣告的異常
- 丟擲其它異常將導致程式執行終止
- 可以直接通過異常宣告定義無異常函式