Go フレームワークの Panic は回復不可能な例外を発生させるために使用され、Recover は Panic から回復してクリーンアップ操作を実行するために使用されます。データベース接続の失敗などの例外を処理できるため、アプリケーションの安定性とユーザー エクスペリエンスが確保されます。
Panic と Recover は、例外を処理する Go フレームワークの 2 つの重要なメカニズムであり、デバッグ プロセスで重要な役割を果たすことができます。
Panic は、例外を発生させるために使用される Go の組み込みメソッドで、現在実行中の goroutine を即座に終了し、例外情報を出力します。一般に、パニックは回復不可能なエラーが発生した場合にのみ使用してください。
使用シナリオ:
構文:
func(parameters) (result, parameters) { // 判断是否需要抛出异常 if (condition) { panic(reason) } return result, parameters }
Recoverはパニックから回復するために使用され、パニックによって発生した例外情報を取得し、実行フローに戻ります。
使用シナリオ:
構文:
func(parameters) (result, parameters) { defer func() { if err := recover(); err != nil { // 处理 panic 异常 } }() return result, parameters }
データベース接続失敗エラーを処理するためにパニックを使用する単純な Go Web サーバーを考えてみましょう:
package main import ( "database/sql" "fmt" "log" "net/http" ) func main() { // 连接数据库 db, err := sql.Open("mysql", "user:password@/database") if err != nil { // 数据库连接失败则抛出 panic panic(err) } // 启动 web 服务器 http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { defer func() { if err := recover(); err != nil { // 捕获 panic 并在 Web 响应中显示错误消息 w.WriteHeader(http.StatusInternalServerError) w.Write([]byte("Internal error occurred. Please try again later.")) log.Printf("Panic occurred: %s", err) } }() // 访问数据库并执行查询 rows, err := db.Query("SELECT * FROM users") if err != nil { // 数据库查询失败则抛出 panic panic(err) } // 处理查询结果 // ... }) log.Fatal(http.ListenAndServe(":8080", nil)) }
上の例では、 Open()
関数データベースに接続し、sql.DB
インスタンスを返します。接続が失敗した場合、Open()
関数はパニックをスローします。 main()
関数は、defer
と recover()
を使用してパニックを捕捉します。 Open()
函数会连接到数据库并返回一个 sql.DB
实例。如果连接失败,Open()
函数会抛出 panic。main()
函数使用 defer
和 recover()
来捕获 panic。
当 Web 服务器处理请求时,Query()
函数会查询数据库并返回查询结果。如果查询失败,Query()
函数会抛出 panic。recover()
Query()
関数はデータベースにクエリを実行し、クエリ結果を返します。クエリが失敗した場合、Query()
関数はパニックをスローします。 recover()
関数は、このパニックをキャプチャし、エラー メッセージをログに書き込みます。 パニックとリカバリを使用すると、アプリケーションは例外を適切に処理しながら、ユーザーフレンドリーなエラーメッセージを提供できます。これは、アプリケーションの安定性を確保し、ユーザー エクスペリエンスを向上させるために重要です。 🎜以上がgolang フレームワークのデバッグ時のパニックとリカバリーの適用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。