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中semaphore(信号量)源码
Apr 03 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang 比较浮点数的大小方式
May 02 Golang
Golang: 内建容器的用法
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
Go语言基础函数基本用法及示例详解
Nov 17 Golang
golang语言指针操作
Apr 14 Golang
Golang bufio详细讲解
Apr 21 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 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自定义加密与解密程序实例
2014/12/31 PHP
Javascript 入门基础学习
2010/03/10 Javascript
jQuery 打造动态下滑菜单实现说明
2010/04/15 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
jQuery开源组件BootstrapValidator使用详解
2017/06/29 jQuery
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
django云端留言板实例详解
2019/07/22 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
承诺书怎么写
2014/03/26 职场文书
个人借款担保书
2014/04/02 职场文书
企业新年寄语
2014/04/04 职场文书
娱乐节目策划方案
2014/06/10 职场文书
激励员工的口号
2014/06/16 职场文书
中职招生先进个人材料
2014/08/31 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
初中信息技术教学计划
2015/01/22 职场文书
环卫处个人工作总结
2015/03/04 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
opencv 分类白天与夜景视频的方法
2021/06/05 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
排查MySQL生产环境索引没有效果
2022/04/11 MySQL