golangエラー処理

1.エラー

表現するための組み込みのエラータイプと間違っ。

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

error 署名付き  Error() string 方法。このインタフェースを実装するすべての種類は、エラーのタイプとして使用することができます。Error()この方法は、エラーの説明を提供します。

パッケージメイン
インポート(
        " FMT " 
        " OS " 

メインFUNC(){ 
        F、ERR: = os.Open(" /test.txt " であれば!誤る= ゼロ{ 
                fmt.Println(ERR)
                リターン
        } 
        fmt.Println( f.Name()、オープンに成功
} 
出力:
オープン /test.txt:そのようなファイルやディレクトリはありません

fmt.Println エラーを印刷する場合、それは内部的に呼び出し、  Error() string エラーの説明を取得する方法を。

取得したファイルパスのエラーが、この方法は非常にエレガントです。更新の言語バージョンでは、エラーのこの記述は、当社のプログラムエラーとなるよう、随時変更される可能性があります

1)より多くの情報のために使用下部タイプ、フィールド構造をアサート

Open関数は、原稿を読み取って見ることができ、戻り値の間違った種類は* PathErrorです。

型PathErrorの構造体{   
    オペアンプ    
    パス文字列
    のErrエラー
} 

FUNC(E * PathError)エラー()文字列 { 戻り e.Op + "  " + e.Path + " " + e.Err.Error()}

* PathErrorタイプは、詳細なフィールドの内容構造のために、によってアサートすることができます。

ERRは、インターフェースの底部を得るようにインターフェース変数、ERR(* os.PathError)は、すなわち、* PathError、アサーションERR * os.PathError型です。

    F、ERR:= os.Open(" /test.txt " であれば ERR、[OK]:= ERR(*。os.PathError); OK { 
        fmt.Println(" パスにファイル"、err.Pathは、" オープンに失敗しました" リターン
    }

2)基本となる構造型をアサートし、方法の構造が詳細については、呼び出し

3)直接比較

次のように定義されたファイルパスパッケージErrBadPattern:

VAR ErrBadPattern = errors.New(" パターンの構文エラー"

エラーの種類の直接比較

    ファイル、エラー:= filepath.Glob(" [ " であれば!エラー= nilを&&エラー== filepath.ErrBadPattern { 
        fmt.Println(エラー)
        のリターン
    }

2。カスタムエラー

カスタムエラーの最も簡単な方法を作成すると、使用することです  errors パッケージの  New 機能を。

パッケージエラー

// 新しいは、指定されたテキストなどの形式エラーを返します。
FUNC新(テキスト文字列)エラー{
     リターンerrorStringに{テキスト} 
} 

// errorStringには、エラーの些細な実装です。
errorStringに入力構造体{ 
    S ストリング
} 

FUNC(E * errorStringに)エラー()文字列{
     戻りESを
}

関数内のアプリケーションerrors.New():

FUNC circleArea(半径のfloat64)(のfloat64、エラー){  
     もし半径が< 0 {
         リターン 0、errors.New(" 面積計算が失敗した、半径がゼロ未満である" 
    } 
    を返すにMath.PIを*半径* 半径、ゼロ
}

fmt.Errorf()エラーメッセージを出力します

    もし半径が< 0 {
         リターン 0、fmt.Errorfは(" 面積計算は、半径%の0.2Fがゼロ未満である、失敗" 半径)
    }

構造の使用方法の詳細については、エラー・フィールドを提供

ポインタ受信機は  *areaError、実装  error インタフェース  Error() string 方法を。

型areaErrorの構造体{   
    ERRの     列の
    半径のfloat64 
} 

FUNC(E * areaError)エラー()文字列{  
     戻り fmt.Sprintf(" 半径%の0.2F:%のS " 、e.radius、e.err)
}の

    場合は半径< 0 {
         リターン 0&areaError { " 半径が負である" 、半径} 
    }

エラーを提供する方法を用いた構造の種類の詳細について

型areaErrorの構造体{   
    ERRの     文字列 // エラー記述 
    長のfloat64 // エラー起因長 
    幅のfloat64 // エラー起因幅
} 
FUNC(E * areaError)エラー()文字列{  
     戻りe.err 
} 

FUNC(E * areaErrorを)lengthNegative()BOOL {  
     戻り e.length < 0 
} 

FUNC(E * areaError)widthNegative()BOOL {  
     戻り <e.width 0 
}
FUNCするrectArea(長さ、幅のfloat64)(のfloat64、エラー){   
    ERR: = "" 
    場合は長さ< 0 { 
        ERR + = " 長さがゼロ未満である" 
    } 
    もし幅< 0 {
         場合 ERR == "" { 
            ERR = " 幅がゼロ未満である
        } { 
            ERR + = 、幅がゼロ未満である" 
        } 
    } 
    場合 ERR!= 『』{
        戻り 0areaError {ERR、長さ、幅} 
    } 
    戻り長さ* 幅、ゼロ
}

3.panic

場合関数は、パニックを発生する、それはすべての実行仕上げ、動作を終了する遅延の関数の呼び出し元の関数、プログラム制御が戻った後。プロセスは、現在まで、継続するコルーチンのすべての機能を終了するには戻る、その後、プログラムはその後、パニック情報をプリントアウトスタックトレース(スタックトレース)をプリントアウトし、最終的にプログラムが終了します。

あなたが可能な限り使用する必要があることに注意してくださいエラーの代わりにパニックを、そして回復します。プログラムの実行を続けることができない場合にのみ、あなたはパニックを使用してメカニズムを回復する必要があります。

パニック2合理的な使用事例があります。

  • プログラムの実行を続けることができないときの回復を間違えないことができ、Lが発生します。一つの例は、Webサーバのポートが結合に必要なことはできないです。この場合、あなたは何をするではない何もあなたがポートにバインドできない場合ので、パニックを使用しますが、必要があります。
  • プログラミングエラーのLが発生しました。他の人がnilを呼び出すために、引数としてそれを使用しながら、我々は、ポインタパラメータを受信する方法を持っている場合。唯一の合法的なポインタを受け取ると呼ばれるメソッドを使用してゼロパラメータ:これはプログラミングエラーであるため、この場合、私たちは、パニックを使用することができます。
FUNCパニック(インターフェース {})

recover 組み込み関数は、制御パニックコルーチンを取り戻すために使用されます。

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

唯一の内部遅延関数呼び出しが  recover 有用であること。遅延関数の呼び出し時には  recover、あなたが取ることができます  panic 正常に戻って実行し、エラーメッセージを、とパニックリニューアルイベント(パニックシーケンス)を停止します。あなたは、外部遅延機能で呼び出した場合  recover、あなたはパニックリニューアルイベントを停止することはできません。

だけ同じに  行くコルーチンで回復するための呼び出しは、単に動作します。recover あなたはパニックの異なるコルーチンを復元することはできません。

 

参考:チュートリアルの一連の移動- 32パニックをし、回復

おすすめ

転載: www.cnblogs.com/embedded-linux/p/11128958.html