golang为什么要统一错误处理


Posted in Golang onApril 03, 2022

1.为什么要统一错误处理

统一错误处理的目的是为了前端开发接收到后端的statuscode,之后便于前端逻辑上开发,以及开发。200代表成功,500失败,400代表找不到、禁止等异常

2.后端封装统一接口

/**
* 统一处理
* 错误码,response,返回内容,error
*/
func HandleResult(statusCode int, response *restful.Response, value interface{}, err error) {
if err != nil {
HandleAllStatus(parseValue(err, statusCode), response, err)
return
}

if statusCode == http.StatusOK {
HandleSuccess(response, value)
return
}
// 解析其他错误
HandleAllStatus(parseValue(value, statusCode), response, value)
}

3.核心函数

func handle(statusCode int, response *restful.Response, req *restful.Request, err error) {
_, fn, line, _ := runtime.Caller(2)
klog.Errorf("%s:%d %v", fn, line, err)
http.Error(response, sanitizer.Replace(err.Error()), statusCode)
}

打印错误日志,哪个文件函数多少行,以及错误原因

4.常见错误处理

func HandleInternalError(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusInternalServerError, response, req, err)
}

// HandleBadRequest writes http.StatusBadRequest and log error
func HandleBadRequest(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusBadRequest, response, req, err)
}

func HandleNotFound(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusNotFound, response, req, err)
}

func HandleForbidden(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusForbidden, response, req, err)
}

func HandleUnauthorized(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusUnauthorized, response, req, err)
}

func HandleTooManyRequests(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusTooManyRequests, response, req, err)
}

func HandleConflict(response *restful.Response, req *restful.Request, err error) {
handle(http.StatusConflict, response, req, err)
}

5.共用错误处理

golang为什么要统一错误处理

 func HandleAllStatus(statusCode int, response *restful.Response, value interface{}) {
if value == nil {
response.WriteHeader(statusCode)
return
}

switch ee := value.(type) {
case error:
handle(statusCode, response, nil, ee)
case string:
response.WriteHeader(statusCode)
response.WriteAsJson(value)
return
default:
response.WriteHeader(statusCode)
//处理是否为byte数组
b, ok := value.([]byte)
if ok {
response.Write(b)
} else {
response.WriteEntity(value)
}
}
}

6.解析错误原因

func parseValue(value interface{}, statusCode int) int {
if value == nil {
return statusCode
}

obj := make(map[string]interface{})
switch tValue := value.(type) {
case error:
json.Unmarshal([]byte(tValue.Error()), &obj)
default:
b, ok := value.([]byte)
if ok {
json.Unmarshal(b, &obj)
} else {
j, err := json.Marshal(value)
if err == nil {
json.Unmarshal(j, &obj)
}
}
}

if s, o := obj["code"]; o {
switch rs := s.(type) {
case string:
rs1, err := strconv.Atoi(rs)
if err != nil {
return rs1
}
case int:
return rs
case float64:
return int(rs)
default:
return statusCode
}

}
return statusCode
}

到此这篇关于golang为什么要统一错误处理的文章就介绍到这了,更多相关golang统一错误处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Golang 相关文章推荐
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
Go标准容器之Ring的使用说明
May 05 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
golang中的struct操作
Nov 11 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go中使用gjson来操作JSON数据的实现
Aug 14 Golang
简单聊聊Golang中defer预计算参数
Mar 25 #Golang
Go 中的空白标识符下划线
golang生成vcf通讯录格式文件详情
golang实现浏览器导出excel文件功能
Golang使用Panic与Recover进行错误捕获
Mar 22 #Golang
Go语言特点及基本数据类型使用详解
详解Golang如何优雅的终止一个服务
Mar 21 #Golang
You might like
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
基于xcache的配置与使用详解
2013/06/18 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
smarty表格换行实例
2014/12/15 PHP
JAVASCRIPT keycode总结
2009/02/04 Javascript
JavaScript Timer实现代码
2010/02/17 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
Angular实现的自定义模糊查询、排序及三角箭头标注功能示例
2017/12/28 Javascript
在vue中使用css modules替代scroped的方法
2018/03/10 Javascript
taro小程序添加骨架屏的实现代码
2019/11/15 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
[01:03:37]Secret vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
深入解析Python编程中JSON模块的使用
2015/10/15 Python
Python3使用requests发闪存的方法
2016/05/11 Python
Linux下python与C++使用dlib实现人脸检测
2018/06/29 Python
python根据url地址下载小文件的实例
2018/12/18 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
2019/10/12 Python
基于Django实现日志记录报错信息
2019/12/17 Python
Django用户身份验证完成示例代码
2020/04/03 Python
解决IDEA 的 plugins 搜不到任何的插件问题
2020/05/04 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
一份Java笔试题
2012/02/21 面试题
机械专业求职信
2014/05/25 职场文书
双拥工作宣传标语
2014/06/26 职场文书
语文课外活动总结
2014/08/27 职场文书
单位介绍信格式范文
2015/05/04 职场文书
民事答辩状范本
2015/05/21 职场文书
公司业务员管理制度
2015/08/05 职场文书
青岛市的收音机研制与生产
2022/04/07 无线电