ホームページ  >  記事  >  バックエンド開発  >  Go言語での例外処理の紹介

Go言語での例外処理の紹介

尚
転載
2019-11-27 15:57:282944ブラウズ

Go言語での例外処理の紹介

Go 言語はシンプルさと優雅さを追求しているため、Go 言語の設計者が従来の try...catch...finally 例外をサポートしていません。例外を制御構造と混在させると、コードが簡単に乱雑になる可能性があると考えられています。

開発者は例外を簡単に悪用して、小さなミスでも例外をスローする可能性があるためです。 Go 言語では、エラーを返すために複数の値が使用されます。例外を使用してエラーを置き換えたり、プロセスを制御したりしないでください。まれに、実際の例外が発生した場合 (除数が 0 など)。 Go で導入された例外処理 (defer、panic、recover) のみを使用してください。

これらの例外の使用シナリオは簡単に説明できます。Go はパニック例外をスローし、defer での回復によって例外をキャプチャし、通常どおり処理します。

コード例:

package main
 
import "fmt"
 
func main(){
    defer func(){ // 必须要先声明defer,否则不能捕获到panic异常
        fmt.Println("c")
        if err:=recover();err!=nil{
            fmt.Println(err) // 这里的err其实就是panic传入的内容,55
        }
        fmt.Println("d")
    }()
    f()
}
 
func f(){
    fmt.Println("a")
    panic(55)
    fmt.Println("b")
    fmt.Println("f")
}

出力結果:

a
c
55
d
終了コード 0、プロセスは正常に終了しました。

defer

defer 本来の英語の意味: vi. 延期する; 延期する; 従う vt. 延期する; 延期する。

defer の考え方は C のデストラクターに似ていますが、Go 言語では「破棄される」のはオブジェクトではなく関数です。defer は、次の場合に実行されるステートメントを追加するために使用されます。機能は終了します。静的である C のデストラクターとは異なり、Go の defer は動的であるため、ここでは指定ではなく追加に重点を置いていることに注意してください。

func f() (result int) {
  defer func() {
    result++
  }()
  return 0
}

上記の関数は 1 を返します。これは、遅延する関数が追加され、関数が戻る前に名前付き戻り値の値が変更されるためです。とても便利ではないですか?ただし、defer ステートメントが実行されない場合、defer 関数は追加されないことに注意してください。上記のプログラムを次のように変更すると、

func f() (result int) {
  return 0
  defer func() {
    result++
  }()
  return 0
}

上記の関数は 0 を返します。 defer を追加する前に関数が返されました。

また、defer は複数回実行できるため、defer スタックが形成され、関数が返されるときに後続の defer ステートメントが最初に呼び出されることにも言及する価値があります。

パニック

##パニック 英語の本来の意味: n. パニック、パニック; パニック adj. パニック; 理由がない vt. パニックになる vi . 非常にパニック

panic は、非常に深刻で回復不可能なエラーを示すために使用されます。 Go 言語では、これは、interface{} 型の値 (つまり、任意の値) をパラメータとして受け取る組み込み関数です。パニックの機能は、私たちが普段遭遇する例外とまったく同じです。ただし、Go には try...catch がないため、通常、パニックによりプログラムがハングします (回復しない限り)。したがって、Go 言語における例外は実際には例外です。プログラムがすぐにハングするかどうかを確認するには、panic を呼び出してみてください。その後、Go の実行中にコール スタックが出力されます。

ただし、重要な点は、関数の実行時にパニックが発生しても、関数はダウンしないということです。パニックは実行時にすぐに上に渡されるのではなく、遅延されます。遅延内のすべての処理が完了すると、またパニックが起こるので上に通過します。したがって、現時点での defer は、try-catch-finally のfinallyと多少似ています。
パニックはとても単純です。実際の例外をスローします。

recover

recover 元の英語の意味: vt. 回復する; 補う; 取り戻す vi. 回復する; 勝つ; 回復するボールを取り戻す n. 準備姿勢に戻す

前述したように、パニック機能はすぐには戻りませんが、一旦保留してから戻ります。現時点 (遅延中) に、パニックを捕捉し、パニックの配信を防ぐ方法があれば、例外処理メカニズムは完璧になります。

Go 言語には、recover 組み込み関数が用意されています。前述したように、パニックが発生すると、ロジックは遅延に移行し、遅延で待機します。recover 関数を呼び出すと、現在のパニックがキャプチャされます (if Ifそうすれば、捕らえられたパニックは上層部に伝わらず、世界に平和が戻るでしょう。あなたがやりたいことができます。

ただし、回復後、ロジックはパニック ポイントまで復元されず、関数は延期後も復帰することに注意してください。

結論:

Go の例外に対する態度 (正確にはパニック) はこれであり、例外の存在を完全に否定するわけではありませんが、同時に例外の使用を強く推奨しません。 。

以上がGo言語での例外処理の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。