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在import自己的包报错的问题
Apr 29 Golang
go设置多个GOPATH的方式
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 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堆排序(heapsort)练习
2013/11/13 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
PHP解耦的三重境界(浅谈服务容器)
2017/03/13 PHP
angularJS中$apply()方法详解
2015/01/07 Javascript
JS的数组迭代方法
2015/02/05 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
javaScript中"=="和"==="的区别详解
2018/03/16 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
微信小程序手机号码验证功能的实例代码
2018/08/28 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
JS获取一个字符串中指定字符串第n次出现的位置
2021/02/10 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
[01:24]2014DOTA2 TI第二日 YYF表示这届谁赢都有可能
2014/07/11 DOTA
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
2018/12/24 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Python 实现日志同时输出到屏幕和文件
2020/02/19 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
2020/06/02 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
经典c++面试题三
2015/07/08 面试题
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
大学辅导员述职报告
2015/01/10 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
create-react-app开发常用配置教程
2022/06/25 Javascript