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语言带缓冲的通道实现
Apr 26 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang DNS服务器的简单实现操作
Apr 30 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go xorm框架的使用
May 22 Golang
Go语言基础知识点介绍
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Go gorilla securecookie库的安装使用详解
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
第十四节 命名空间 [14]
2006/10/09 PHP
模拟xcopy的函数
2006/10/09 PHP
accesskey 提交
2006/06/26 Javascript
Chrome中JSON.parse的特殊实现
2011/01/12 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
javascript实现仿百度图片的瀑布流加载效果
2016/04/20 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
jquery获取easyui日期控件的值实现方法
2016/11/09 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
vue脚手架中配置Sass的方法
2018/01/04 Javascript
vue devtools的安装与使用教程
2018/08/08 Javascript
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
2018/09/14 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
python中requests和https使用简单示例
2018/01/18 Python
网易有道2017内推编程题 洗牌(python)
2019/06/19 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
雷蛇美国官网:Razer
2020/04/03 全球购物
大唐电信科技股份有限公司java工程师面试经历
2016/12/09 面试题
外贸业务员求职自荐信分享
2013/09/21 职场文书
员工团队活动方案
2014/08/28 职场文书
优秀班集体申报材料
2014/12/25 职场文书
2015年幼师工作总结
2015/04/28 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
python ConfigParser库的使用及遇到的坑
2022/02/12 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js