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 29 Golang
解决Go gorm踩过的坑
Apr 30 Golang
Go 语言结构实例分析
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Golang 字符串的常见操作
Apr 19 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
Go语言怎么使用变长参数函数
Jul 15 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
Go gorilla/sessions库安装使用
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
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
Linux系统中为php添加pcntl扩展
2016/08/28 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP预定义接口――Iterator用法示例
2020/06/05 PHP
javascript 短路法代码精简
2009/08/20 Javascript
学习ExtJS form布局
2009/10/08 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
纯javascript实现分页(两种方法)
2015/08/26 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
JavaScript小技巧整理
2015/12/30 Javascript
jQuery+php实时获取及响应文本框输入内容的方法
2016/05/24 Javascript
jQuery ajax全局函数处理session过期后的ajax跳转问题
2016/06/03 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
vue的webcamjs集成方式
2020/11/16 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python 使用sys.stdin和fileinput读入标准输入的方法
2018/10/17 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
sklearn+python:线性回归案例
2020/02/24 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
护理专业本科生自荐信
2013/10/01 职场文书
《小石潭记》教学反思
2014/02/13 职场文书
成立公司计划书
2014/05/07 职场文书
2015年社区教育工作总结
2015/05/13 职场文书
在Python 中将类对象序列化为JSON
2022/04/06 Python
Python使用socket去实现TCP客户端和TCP服务端
2022/04/12 Python
Python find()、rfind()方法及作用
2022/12/24 Python