C++の関数異常宣言

2317 ワード

まずコードを見てみましょう.
#include 
#include 

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

    次に、いくつかの注意点を示します.
  • 関数異常宣言時のコンパイラとの契約
  • 関数が例外を宣言すると、宣言された例外しか放出されません.
  • 他の異常を放出すると、プログラムの実行が終了する
  • .
  • は、異常宣言によって直接異常なし関数
  • を定義することができる.