1. 程式人生 > >40、不一樣的C++系列--函式異常宣告

40、不一樣的C++系列--函式異常宣告

函式異常宣告

首先來看一段程式碼:

#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...

接下來給出幾個注意事項:

  • 函式異常宣告時一種與編譯器之間的契約
  • 函式宣告異常後就只能丟擲宣告的異常
    • 丟擲其它異常將導致程式執行終止
    • 可以直接通過異常宣告定義無異常函式