banner
音小董

哩哔哩哔

这世上的热闹出自孤单

第6章:Go言語のエラー処理

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
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。