gin: 自定义异常、抛出异常、捕捉异常

一,代码

自定义异常:

package global

// 自定义错误类型
type CustomError struct {
	Code    int
	Error    error
}

抛出异常:

func (ic *MediaController) List(c *gin.Context) {

	err:=errors.New("列表查询执行失败...")
	panic(global.CustomError{Code: 1500, Error: err})

	var data = gin.H{
		"Title": "Gin 列表示例",
		"Message": "欢迎来到Gin 列表!",
	}
	c.HTML(200, "list.html", data)
}

捕捉异常:

routes中

//500,内部发生异常时的处理
func Recover(c *gin.Context) {
	defer func() {
		if err := recover(); err != nil {


			//判断类型,如果是自定义的数据库错误,无需写日志,直接返回
			if customError, ok := err.(global.CustomError); ok {
				fmt.Println("转换自定义异常类型成功")
					msg:="服务器内部错误:"+strconv.Itoa(customError.Code)+":"+customError.Error.Error()
				    ReturnToUser(c,500,msg)
					return
			}

			//打印错误堆栈信息
			timeStr := time.Now().Format("2006-01-02 15:04:05")
			fmt.Println("当前时间:", timeStr)
			fmt.Println("当前访问path:", c.FullPath())
			fmt.Println("当前完整地址:", c.Request.URL.String())
			fmt.Println("当前协议:", c.Request.Proto)
			fmt.Println("当前get参数:",global.GetAllGetParams(c))
			fmt.Println("当前post参数:",global.GetAllPostParams(c))
			fmt.Println("当前访问方法:", c.Request.Method)
			fmt.Println("当前访问Host:", c.Request.Host)
			fmt.Println("当前IP:",c.ClientIP())
			fmt.Println("当前浏览器:",c.Request.UserAgent())
			fmt.Println("发生异常:", err)
			//global.Logger.Errorf("stack: %v",string(debug.Stack()))
			debug.PrintStack()
			//log
			content:= timeStr+" "+c.ClientIP()+" "+c.Request.Proto+" "+ c.Request.Method+" "+c.Request.Host
			content += " "+c.Request.URL.String()+"\n"
			content += "get参数:"+global.GetAllGetParams(c)+"\n"
			content += "post参数:"+global.GetAllPostParams(c)+"\n"
			content += "UserAgent:"+c.Request.UserAgent()+"\n"
			requestHeader := c.Request.Header
			requestHeaderStr:=fmt.Sprintf("%v",requestHeader)
			content += "requestHeader:"+requestHeaderStr+"\n"


			//请求体 body
			requestBody := ""
			b, errR := c.GetRawData()
			if errR != nil {
				requestBody = "failed to get request body"
			} else {
				requestBody = string(b)
			}
			c.Request.Body = io.NopCloser(bytes.NewBuffer(b))
			fmt.Println("请求体:",requestBody)

			content += "requestBody:"+requestBody+"\n"
			content += "err:"+fmt.Sprintf("%v",err)+"\n"
			content += string(debug.Stack())+"\n"
			global.AccessLoggerWrite(content)
			//return
			//global.NewResult(c).ErrorCode(500,"服务器内部错误",nil)
			ReturnToUser(c,500,"服务器内部错误")
		}
	}()
	//继续后续接口调用
	c.Next()
}

func ReturnToUser(c *gin.Context,code int,msg string) {
	if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
		global.NewResult(c).ErrorCode(code,msg,nil)
	} else {
		c.HTML(200, "sysinfo.html", gin.H{
			"Title": "Gin 模板示例",
			"Code": code,
			"Message": msg,
		})
	}
}

二,运行结果:

image

posted @ 2025-09-20 09:46  刘宏缔的架构森林  阅读(4)  评论(0)    收藏  举报