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如何替换某个文件中的字符串
Apr 25 Golang
go语言中json数据的读取和写出操作
Apr 28 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
Golang的继承模拟实例
Jun 30 Golang
入门学习Go的基本语法
Jul 07 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 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 Squid中可缓存的动态网页设计
2008/09/17 PHP
PHP Class&Object -- 解析PHP实现二叉树
2013/06/25 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
2014/07/04 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
Yii2如何批量添加数据
2016/05/17 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
JavaScript中实现块作用域的方法
2010/04/01 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
2017/09/13 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
python实现通过pil模块对图片格式进行转换的方法
2015/03/24 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
Python魔法方法详解
2019/02/13 Python
记录模型训练时loss值的变化情况
2020/06/16 Python
CSS3教程(7):CSS3嵌入字体
2009/04/02 HTML / CSS
LightInTheBox西班牙站点:全球商品在线采购
2016/09/22 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
《曹刿论战》教学反思
2014/03/02 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
环保倡议书100字
2014/05/15 职场文书
员工工作及收入证明
2014/10/28 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
体育教师个人工作总结
2015/02/09 职场文书
如何利用python和DOS获取wifi密码
2021/03/31 Python