入門言語(8)例外処理を行きます

1、エラー・インタフェース

次のように移動インターフェイスタイプに内蔵されたエラー処理の標準モード、即ちインタフェース誤差に言語を移動し、インタフェースが定義されます。

型エラーインタフェース{
    エラー()文字列
}

囲碁言語の標準ライブラリのコードのパッケージのエラーは、ユーザーのための方法を提供します。

パッケージエラー

errorStringに型構造体を{
    テキスト文字列 
}

FUNC新(テキスト文字列)エラー{ 
     リターンerrorStringに{テキスト}
}

FUNC(E * errorStringに)エラー()文字列{ 
     戻りe.text
}

この方法のもう一つのタイプは、FMTパッケージErrorf関数を呼び出すエラー値を生成することがあります。

パッケージFMT
インポートエラー

FUNC Errorf(フォーマットストリング、引数... インターフェイス{})エラー{
     リターンerrors.New(SPRINTF(フォーマット、引数...))
}

サンプルコード

インポート(
     エラー
    FMT 

FUNCのmain(){
    VaRの ERR1エラー= errors.New(" ノーマルERR1 " 
    fmt.Println(ERR1)// 通常ERR1

    VaRの ERR2誤差= fmt.Errorf(" %S "" ノーマルERR2 " 
    fmt.Println(ERR2)// 通常ERR2 
}

この関数は通常、戻り値の最後にエラーメッセージを返します。

インポート(
     エラー
    FMT 

FUNC除算(B用のfloat64)(結果のfloat64、ERRエラー){
    もし B == 0 {
        結果 = 0.0 
        ERR = errors.New(" ランタイムエラー:ゼロによる除算" リターン
    }

    結果 = A / Bを
    ERR = nilの
     リターン
}

FUNCのmain(){
    ERR、R:分割(= 10.00 であれば、ERR =!ゼロ{
        fmt.Println(ERR)// エラー処理エラーランタイム:ゼロ除算 
    } {
        fmt.Println(R&LT)// 戻り値
    }
}

2、パニック

  通常の状況下では、消費者は、追加のエラー・タイプの値を返すための方法かもしれプログラムにエラー状態を報告します。

  しかし、エラーが例外paincランタイムエラーを引き起こす可能性等境界配列アクセス、ヌルポインタ参照、のうちのような回復不能な状態を、検出されたとき。このとき、上記のエラー処理のアプローチは明らかに適切ではありません。逆に、一般的に、我々はパニック関数を呼び出すことによって、一般的なエラーを報告するべきではありませんが、唯一の致命的なエラーを報告するための方法としてそれを使用する必要があります。いくつかのシーンが起こっ起こってはいけないとき、私たちはパニックを呼び出す必要があります。

  パニック例外が発生した場合、一般的に、プログラムが動作を中断し、直ちにゴルーチンで実行される(遅延関数(ディファー機構)の最初のスレッドとして理解することができる。続いて、プログラムがクラッシュした出力ログ情報を、ログ情報パニック値と関数呼び出しスタックトレース情報を含みます。

  すべてパニックに直接内蔵のパニック関数を呼び出す実行しているから時に例外も異常パニックが発生することができません。パニック関数は、パラメータとして任意の値を受け入れます。

FUNCパニック(Vのインタフェース {})

関数呼び出しのパニックはパニック例外を発生させました:

テスト機能(){
    fmt.Println(" FUNC TESTA()" 
}

TESTB関数(){
    パニック(" FUNC TESTB():パニック" 
}

テストケース関数(){
    fmt.Println(" FUNC TESTC()" 
}

FUNCのmain(){
    TESTA()
    TESTB()// TESTB()例外は、割り込みルーチンが発生
    TESTCを()
}

内蔵パニック機能パニック例外をトリガー:

テスト機能(){
    fmt.Println(" FUNC TESTA()" 
}

TESTB、FUNC(X INT ){
     VARの A [ 10 ] INT 
    A [X] = 222  // X = 11、配列の境界
 }

テストケース関数(){
    fmt.Println(" FUNC TESTC()" 
}

FUNCのmain(){
    TESTA()
    TESTB(11// TESTB()例外は、割り込みルーチンが発生
    )(TESTCを
}

3、回復

  例外がトリガされるとパニックは、プログラムの実行時にクラッシュします。誰もが任意のプログラムの実行時エラーが発生しないことを保証することはできませんので、これは、我々が見たいものを、確かではありません。

  しかし、囲碁の言語は、私たちが実行している--recover機能で、内蔵の「インターセプト」パニックに専念しています。パニックの状態から回復し、プロセスの制御を取り戻すために実行するために、現在のプログラムであってもよいです。

)(回復FUNC インターフェースを } {

注:唯一の回復に有効な延期関数呼び出しを。

あなたが回復する組み込み関数呼び出し、および延期文関数の異常がパニックを発生して定義されている場合、プログラムはパニックとリターンパニック値から回復する回復します。原因パニック異常な機能は引き続き実行されませんが、通常の状態に戻ることができます。nilを返しますを回復し、パニックが発生していないときに回復呼び出します。

サンプルコード:

テスト機能(){
    fmt.Println(" FUNC TESTA()" 
}

FUNC TESTB()(ERRエラー){
    FUNC延期(){ // 回復を提供異常が発生した場合、
        IF!X =; =リカバリ():X ゼロ{
             // パニック値は、エラー・メッセージに追加される;
           // 、受信誤差ERR変数情報が呼び出しに返されます人。
            fmt.Errorf = ERR(" 内部エラー:%のV " 、X)
        }
    }()

    パニック(" FUNC TESTB():パニック" 
}

テストケース関数(){
    fmt.Println(" FUNC TESTC()" 
}

FUNCのmain(){
    TESTA()
    ERR: = TESTB()
    fmt.Println(ERR)
    TESTC()

    / *
        結果:
        機能テスト()
        内部エラー:FUNC TESTB():パニック
        テストケース機能()
    * / 
}

エラーによる通話遅延、捕獲フォローアップコールが遅れることがありますが、唯一の最後のエラーを捕捉することができます。

FUNC試験(){
    ディファーFUNC(){
        fmt.Println((回復))
    }()

    ディファーFUNC(){
        パニック(延期パニック
    }()

    パニック(テストパニック
}

FUNCのmain(){
    テスト()
    // 業績:延期パニック 
}

 

おすすめ

転載: www.cnblogs.com/xdyixia/p/11895748.html