Go 语言中的错误处理与其他语言不太一样,它把错误当成一种值来处理,更强调判断错误、处理错误,而不是一股脑的 catch 捕获异常。我们可以在代码中使用 recover 来会恢复程序中意想不到的 panic
gin 中间件捕获异常
// CustomRecovery 自定义错误 (panic) 拦截中间件、对可能发生的错误进行拦截、统一记录
func CustomRecovery() gin.HandlerFunc {
DefaultErrorWriter := &PanicExceptionRecord{}
return gin.RecoveryWithWriter(DefaultErrorWriter, func(c *gin.Context, err interface{}) {
// 这里针对发生的panic等异常进行统一响应即
errStr := ""
if viper.GetString("mode") == "debug" {
errStr = fmt.Sprintf("%v", err)
}
response.ApiResponses.ResponseErrorWithMsg(c, common.CodeFail, errStr)
})
}
// PanicExceptionRecord panic等异常记录
type PanicExceptionRecord struct{}
func (p *PanicExceptionRecord) Write(b []byte) (n int, err error) {
s1 := "An error occurred in the server's internal code:"
var build strings.Builder
build.WriteString(s1)
build.Writ