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,
})
}
}
二,运行结果:

浙公网安备 33010602011771号