touka/recovery.go
2025-05-28 18:25:28 +08:00

38 lines
1.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package touka
import (
"fmt"
"log"
"net/http"
"runtime/debug"
)
// Recovery 返回一个 Touka 的 HandlerFunc用于捕获处理链中的 panic。
func Recovery() HandlerFunc {
return func(c *Context) {
// 使用 defer 和 recover() 来捕获 panic
defer func() {
if r := recover(); r != nil {
// 记录 panic 信息和堆栈追踪
err := fmt.Errorf("panic occurred: %v", r)
log.Printf("[Recovery] %s\n%s", err, debug.Stack()) // 记录错误和堆栈
// 检查客户端是否已断开连接,如果已断开则不再尝试写入响应
select {
case <-c.Request.Context().Done():
log.Printf("[Recovery] Client disconnected, skipping response for panic: %v", r)
return // 客户端已断开,直接返回
default:
// 客户端未断开,返回 500 Internal Server Error
// 使用统一的错误处理机制
c.engine.errorHandle.handler(c, http.StatusInternalServerError)
// Abort() 确保后续的处理函数不再执行
c.Abort()
}
}
}()
// 继续执行处理链中的下一个处理函数
c.Next()
}
}