recover
try catch メカニズムはありませんが、実際には Go にも同様の回復メカニズムがあります。使い方は非常に簡単です。簡単: (推奨学習: go)
package main import "fmt" func main() { fmt.Printf("%d\n", cal(1, 2)) fmt.Printf("%d\n", cal(5, 2)) fmt.Printf("%d\n", cal(5, 0)) fmt.Printf("%d\n", cal(9, 2)) } func cal(a, b int) int { defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() return a / b }
まず第一に、誰もが defer の役割を理解する必要があります。簡単に言うと、defer は次のようなものです。オブジェクト指向におけるデストラクタ この関数ではパニックで終了した場合でも終了時に実行されます。
つまり、cal 関数は終了するたびに例外が発生したかどうかをチェックし、例外が発生した場合にはログを記録するなどの処理を行うことで、プログラムの実行を継続できます。
package main import ( "errors" "fmt" "math" ) func main() { _, err := IntFromInt64(math.MaxInt32 + 1) if err != nil { fmt.Println(err) } } func ConvertInt64ToInt(i64 int64) int { if math.MinInt32 <= i64 && i64 <= math.MaxInt32 { return int(i64) } panic("can't convert int64 to int") } func IntFromInt64(i64 int64) (i int, err error) {//这里 defer func() { if err2 := recover(); err2 != nil { i = 0//这里 err = errors.New("ttt")//这里 } }() i = ConvertInt64ToInt(i64) return i, nil }
主なアイデア: defer を使用して、return の前に戻り変数 (i と err として事前に決定されている) の値を変更します
以上がgolang リカバリ後の復帰方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。