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中的空slice案例
Apr 27 Golang
golang json数组拼接的实例
Apr 28 Golang
golang 比较浮点数的大小方式
May 02 Golang
go设置多个GOPATH的方式
May 05 Golang
go mod 安装依赖 unkown revision问题的解决方案
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
Golang的继承模拟实例
Jun 30 Golang
golang生成vcf通讯录格式文件详情
Mar 25 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
Golang ort 中的sortInts 方法
Apr 24 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 array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
iframe 异步加载技术及性能分析
2011/07/19 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery中map函数的两种方式
2017/04/07 jQuery
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
python3实现逐字输出的方法
2019/01/23 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Django Aggregation聚合使用方法解析
2019/08/01 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
ubuntu上安装python的实例方法
2019/09/30 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
使用python检查yaml配置文件是否符合要求
2020/04/09 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
宣传策划类求职信范文
2014/01/31 职场文书
美国探亲签证邀请信
2014/02/05 职场文书
药学职务聘任书
2014/03/29 职场文书
爱护草坪标语
2014/06/24 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
运动会稿件100字
2014/09/24 职场文书
给客户的检讨书
2014/12/21 职场文书