Go 言語のリカバリ関数は、予期しないエラーをキャプチャして処理するために使用される goroutine でパニック レコードを管理するスケジューラーを通じて実装されます。現在の goroutine 内のパニックのみをキャプチャし、関数が戻る前に defer ステートメントを使用して回復関数を実行し、回復関数がインターフェイス タイプのパニック値を受け取り、より分かりやすいエラー メッセージを出力します。
Go関数のリカバリ関数の実装方法
Go言語のrecover
関数を使用すると、ゴルーチンの実行によるパニックから回復できます。これは、予期しないエラーを検出して処理するのに非常に役立ちます。 recover
函数允许从正在运行的 goroutine 中恢复 panic。它在捕获和处理意外错误方面非常有用。
实现
recover
的实现基于 Go 语言的调度程序。调度程序负责管理 goroutine 的执行。它维护着一个 panic 记录,其中存储了最新发生的 panic 值。
当 panic 发生时,调度程序将 panic 值保存在 panic 记录中,并终止当前正在执行的 goroutine。然后,它将控制权交给将该 goroutine 标记为 "dead" 的 runtime。
如果其他 goroutine 正在等待该 goroutine 退出,它们将收到一个 Recover
消息。该消息包含 panic 记录中的 panic 值。
实战案例
假设我们有一个可能引发 panic 的函数:
func DivideByZero(x, y int) { if y == 0 { panic("division by zero") } fmt.Println(x / y) }
我们可以使用 recover
从 panic 中恢复,并打印一个更友好的错误消息:
func main() { defer func() { if err := recover(); err != nil { fmt.Println("Error:", err) } }() DivideByZero(10, 0) }
输出:
Error: division by zero
注意
defer
语句用于在函数返回之前运行恢复函数。interface{}
recover
は Go 言語スケジューラに基づいています。スケジューラはゴルーチンの実行を管理する責任があります。最新のパニック値を保存するパニック レコードを維持します。 🎜🎜パニックが発生すると、スケジューラーはパニック値をパニックレコードに保存し、現在実行中のゴルーチンを終了します。次に、ゴルーチンを「デッド」としてマークするランタイムに制御を渡します。 🎜🎜他のゴルーチンがこのゴルーチンの終了を待っている場合、それらは Recover
メッセージを受け取ります。メッセージには、パニック レコードのパニック値が含まれています。 🎜🎜🎜実際的なケース🎜🎜🎜 パニックを引き起こす可能性のある関数があるとします: 🎜rrreee🎜 recover
を使用してパニックから回復し、よりわかりやすいエラー メッセージを出力できます: 🎜rrreee🎜Output :🎜rrreee🎜🎜注 🎜🎜defer
ステートメントは、関数が戻る前にリカバリ関数を実行するために使用されます。 🎜🎜リカバリ関数は、パニック値を受け取るためにタイプ interface{}
のパラメータを必要とする匿名関数です。 🎜🎜回復関数は、現在の goroutine 内のパニックのみをキャプチャします。他のゴルーチンのパニックをキャッチすることはできません。 🎜🎜以上がgolang機能のリカバリ機能はどのように実装されていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。