序文
先ほど、一般的なエラーを処理するためのエラー タイプについて説明しましたが、この記事では、より深刻なエラーを処理するためのパニック関数とリカバリ関数の使用について説明します。簡単に言うと、プログラムの実行中に処理できないエラーや例外が発生すると、panic
関数が呼び出されて実行時エラーが発生し、プログラムは実行を終了してエラー メッセージをスローします。プログラムのクラッシュを避けるために、関数を使用してエラーをキャッチし、処理したり、プログラムの実行を再開したりrecover
できます。通常、関数はステートメントに記述されます。recover
defer
パニック機能
パニック機能は組み込み関数であり、その構造は次のとおりです。
func panic(v interface{})
この関数は、通常はエラーの説明であるインターフェイス タイプの値を受け取ります。この関数を呼び出した後、例外がスローされ、現在のプログラム フローが終了し、現在の例外情報がスタックに記録されます。この関数は、配列の範囲外または NULL ポインター参照が発生したときに、アクティブまたはパッシブに呼び出すことができます。
前回の記事の除算の例に少し変更を加え、エラー処理にパニックを使用します。
package main
import (
"fmt"
)
func divide(a, b int) int{
if b == 0 {
panic("division by zero")
}
return a / b
}
func main() {
result := divide(10, 0)
fmt.Println("the result is ",result)
}
実行後、プログラムは直接終了し、division by zero
エラーが報告されます。
回復機能
場合によっては、パニック関数を直接的かつ失礼に終了させたくないことがあります。このとき、リカバリ関数を使用してパニックをキャプチャできます。リカバリ関数は defer キーワードの後にのみ記述できることに注意してください。
reverse も組み込み関数であり、その構造は次のとおりです。
func recover() interface{}
パニック機能によって報告されたエラーをキャプチャし、インターフェイス タイプを使用して返すことができます。
プログラムが強制終了せずに実行を継続できるように、recover を使用してサンプルを再度変更します。コードは次のとおりです。
package main
import (
"fmt"
)
func divide(a, b int) int{
defer func() {
if err:=recover();err!=nil {
fmt.Printf("runtime panic : %v\n", err)
}
}()
if b == 0 {
panic("division by zero")
}
return a / b
}
func main() {
result := divide(10, 0)
fmt.Println("the result is ",result)
}
要約する
このブログでは、パニックとリカバリを使用して Go 言語で例外を処理する方法を検討します。プログラムで処理できないエラーが発生した場合、panic 関数を使用して例外を生成し、recover 関数と defer キーワードを組み合わせて例外から回復できます。