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 相关文章推荐
golang正则之命名分组方式
Apr 25 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
golang 实现时间戳和时间的转化
May 07 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go 中的空白标识符下划线
Mar 25 Golang
golang为什么要统一错误处理
Apr 03 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中英混合字符串截取函数代码
2011/07/17 PHP
php中的curl使用入门教程和常见用法实例
2014/04/10 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
JavaScript及jquey实现多个数组的合并操作
2014/09/06 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
jQuery常用样式操作实例分析(获取、设置、追加、删除、判断等)
2016/09/08 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
python读取word文档的方法
2015/05/09 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
Python函数中的可变长参数详解
2019/09/12 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
Python -m参数原理及使用方法解析
2020/08/21 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
来自Ocado的宠物商店:Fetch
2018/07/10 全球购物
绿化先进工作者事迹材料
2014/01/30 职场文书
廉洁自律承诺书
2014/03/27 职场文书
升国旗演讲稿
2014/09/05 职场文书
关于工作经历的证明书
2014/10/11 职场文书
党员剖析材料范文
2014/12/18 职场文书
大学班干部竞选稿
2015/11/20 职场文书
服务行业标语口号
2015/12/26 职场文书
外出学习心得体会范文
2016/01/18 职场文书
初二英语教学反思
2016/02/15 职场文书
读《解忧杂货店》有感:请相信一切都是最好的安排
2019/11/07 职场文书
Golang中channel的原理解读(推荐)
2021/10/16 Golang