Go 言語はシンプルさと優雅さを追求しているため、Go 言語の設計者が従来の try...catch...finally 例外をサポートしていません。例外を制御構造と混在させると、コードが簡単に乱雑になる可能性があると考えられています。なぜなら、開発者は例外を簡単に悪用したり、小さなエラーに対して例外をスローしたりする可能性があるからです。
Go 言語では、エラーを返すには複数値の return を使用します。例外を使用してエラーを置き換えたり、プロセスを制御したりしないでください。まれに、実際の例外が発生した場合 (除数が 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 d exit code 0, process exited normally.
defer
#defer 英語の本来の意味: vi. 延期する; 延期する; vt に従う. 延期する ; 延期する。 defer の考え方は C のデストラクターに似ていますが、Go 言語では「破棄される」のはオブジェクトではなく関数です。defer は、次の場合に実行されるステートメントを追加するために使用されます。機能は終了します。静的である C のデストラクターとは異なり、Go の defer は動的であるため、ここでは指定ではなく追加に重点を置いていることに注意してください。func f() (result int) { defer func() { result++ }() return 0 }
panic
panic は、非常に深刻で回復不可能なエラーを示すために使用されます。 Go 言語では、これは、interface{} 型の値 (つまり、任意の値) をパラメータとして受け取る組み込み関数です。パニックの機能は、私たちが普段遭遇する例外とまったく同じです。 ただし、Go には try...catch がないため、通常、パニックが発生するとプログラムがハングします (プログラムが回復しない限り)。したがって、Go 言語における例外は実際には例外です。プログラムがすぐにハングするかどうかを確認するには、panic を呼び出してみてください。その後、Go の実行中にコール スタックが出力されます。 ただし、重要な点は、関数の実行時にパニックが発生しても、関数はダウンしないということです。パニックは実行時にすぐに上位に転送されるのではなく、延期され、延期された内容はすべて終了します。 . 、パニックは再び上に伝わります。したがって、現時点では、defer は try-catch-finally の Final に少し似ています。recover
#前述したように、パニック関数はすぐには戻りませんが、最初に遅延してから戻ります。現時点 (遅延中) に、パニックを捕捉し、パニックの配信を防ぐ方法があれば、例外処理メカニズムは完璧になります。 Go 言語には、recover 組み込み関数が用意されています。前述したように、パニックが発生すると、ロジックは遅延に移行し、遅延で待機します。recover 関数を呼び出すと、現在のパニックがキャプチャされます (if Ifそうすれば、捕らえられたパニックは上層部に伝わらず、世界に平和が戻るでしょう。あなたがやりたいことができます。 ただし、回復後、ロジックはパニック ポイントまで復元されず、関数は延期後も復帰することに注意してください。 Go 言語の知識について詳しくは、PHP 中国語 Web サイトのgo 言語チュートリアル 列に注目してください。
以上がGo言語での例外処理メソッドの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。