defer+recover によるエラー処理メカニズム#
Go では、コードのエレガントさを追求し、defer+recover メカニズムを導入してエラーをキャッチして処理します。
package main
import "fmt"
func main() {
test()
fmt.Println("上記の除算操作は成功しました")
fmt.Println("以下のロジックを正常に実行します")
}
func test() {
defer func() {
//recover組み込み関数を呼び出すことで、エラーをキャッチできます:
err := recover()
//エラーがキャッチされない場合、戻り値はゼロ値:nil
if err != nil {
fmt.Println("エラーがキャッチされました")
fmt.Println("エラー内容:", err)
}
}()
num1 := 10
num2 := 0
result := num1 / num2
fmt.Println(result)
}
実行結果:
エラーがキャッチされました
エラー内容: runtime error: integer divide by zero
上記の除算操作は成功しました
以下のロジックを正常に実行します
カスタムエラー#
カスタムエラーを作成するには、errors パッケージの New 関数を呼び出してエラータイプを返します
プログラムでエラーが発生し、プログラムを中断して終了する場合は、組み込みの panic 関数を使用します
package main
import (
"errors"
"fmt"
)
func main() {
e := test2()
panic(e) //エラーが発生した場合、プログラムを中断して終了します
fmt.Println("上記の除算操作は終了しました")
fmt.Println("以下のロジックを正常に実行します")
}
func test2() (err error) {
num1 := 10
num2 := 0
if num2 == 0 { //num2が0の場合、エラーを返します
return errors.New("プログラムでエラーが発生しました。除数は0にすることはできません") //New関数はエラータイプを返します
} else { //num2が0でない場合、正常に実行します
result := num1 / num2
fmt.Println(result)
return nil
}
}
実行結果:
panic: プログラムでエラーが発生しました。除数は0にすることはできません
goroutine 1 [running]:
main.main()
E:/Golang/demo/エラー処理/test2.go:10 +0x27