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语言-在mac下brew升级golang
Apr 25 Golang
Golang: 内建容器的用法
May 05 Golang
go语言中fallthrough的用法说明
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
golang生成并解析JSON
Apr 14 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang并发工具Singleflight
May 06 Golang
Go语言入门exec的基本使用
May 20 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批量删除数据
2007/01/18 PHP
php上传文件常见问题总结
2015/02/03 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
2016/12/14 PHP
微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解
2019/04/10 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
php redis setnx分布式锁简单原理解析
2020/10/23 PHP
JS 毫秒转时间示例代码
2013/09/22 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
JavaScript框架(iframe)操作总结
2014/04/16 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
jQuery实现的数值范围range2dslider选取插件特效多款代码分享
2015/08/27 Javascript
js点击按钮实现带遮罩层的弹出视频效果
2015/12/19 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
Vue-Access-Control 前端用户权限控制解决方案
2017/12/01 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
JavaScript实现多重继承的方法分析
2018/01/09 Javascript
浅谈react-router@4.0 使用方法和源码分析
2019/06/04 Javascript
Vue中util的工具函数实例详解
2019/07/08 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
基于layui轮播图满屏是高度自适应的解决方法
2019/09/16 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
angular inputNumber指令输入框只能输入数字的实现
2019/12/03 Javascript
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python使用googletrans报错的解决方法
2018/09/25 Python
python实现对输入的密文加密
2019/03/20 Python
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
2013/06/05 面试题
项目管理计划书
2014/01/09 职场文书
会计电算化个人求职信范文
2014/01/24 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
贷款承诺书
2015/01/20 职场文书
2015年酒店工作总结范文
2015/04/07 职场文书
《画家和牧童》教学反思
2016/02/17 职场文书
pandas中DataFrame重置索引的几种方法
2021/05/24 Python
Android基于Fresco实现圆角和圆形图片
2022/04/01 Java/Android