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语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
对Golang中的FORM相关字段理解
May 02 Golang
golang 比较浮点数的大小方式
May 02 Golang
使用golang编写一个并发工作队列
May 08 Golang
go web 预防跨站脚本的实现方式
Jun 11 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
Go 内联优化让程序员爱不释手
Jun 21 Golang
go goth封装第三方认证库示例详解
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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
JavaScript通过正则表达式实现表单验证电话号码
2014/03/07 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
JQuery实现动态添加删除评论的方法
2015/05/18 Javascript
基于jQuery和CSS3制作数字时钟附源码下载(jquery篇)
2015/11/24 Javascript
JS中Json数据的处理和解析JSON数据的方法详解
2016/06/29 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
区别JavaScript函数声明与变量声明
2018/09/12 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
Python3安装Pymongo详细步骤
2017/05/26 Python
numpy排序与集合运算用法示例
2017/12/15 Python
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Python3 批量扫描端口的例子
2019/07/25 Python
python通过http下载文件的方法详解
2019/07/26 Python
pytorch 准备、训练和测试自己的图片数据的方法
2020/01/10 Python
详解python UDP 编程
2020/08/24 Python
python 调用Google翻译接口的方法
2020/12/09 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
私有程序集与共享程序集有什么区别
2013/04/05 面试题
Linux如何压缩可执行文件
2013/10/21 面试题
春节活动策划方案
2014/01/24 职场文书
甜点店创业计划书
2014/01/27 职场文书
实习生矿工检讨书
2014/10/13 职场文书
三人合伙协议书范本
2014/10/29 职场文书
辣妈辣妹观后感
2015/06/10 职场文书