golang-统一异常处理

爱吃豆包 · · 3535 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在我们意料中的,使用 error, 意料之外的用 panic

异常分为系统异常, 和 业务异常!
业务异常是可以抛给用户看的,系统异常是我们自己处理的!

// 自定义异常
// 定义一个 UserError 接口
type UserError interface {
    error
    Message() string
}



里一个地方实现了 上面的 UserError 异常接口

// 实现 UserError 接口
type UserError string

// 实现 UserError 接口 里面的方法
func (e UserError) Error() string {
    return e.Message()
}

// 实现 UserError 接口 里面的方法
func (e UserError) Message() string {
    return string(e)
}

这一个例子,使用了异常捕获!
业务异常是可以抛给用户看的,系统异常是我们自己处理的!
UserError 是我们的业务异常

// 声明一个函数类型
// 这样是声明的函数只是一个占位用
type appHandel func(writer http.ResponseWriter, request *http.Request) error


// 函数式编程
func errWrapper (handel appHandel) func(writer http.ResponseWriter, request *http.Request)  {

    // 函数式编程,必须return 函数类型, 因为我的返回值就是函数
    return func(writer http.ResponseWriter, request *http.Request) {

        // 捕获异常
        defer func() {
            if r := recover(); r != nil {
                log.Panicf("Panic: %v", r)
                http.Error(writer, http.StatusText(http.StatusInternalServerError),
                    http.StatusInternalServerError)
            }

        }()


        err := handel(writer, request)
        if err != nil {

            // 如果是我们自己异常,就展示给用户看
            if userError, ok := err.(UserError); ok {
                http.Error(writer, userError.Message(), http.StatusBadRequest)
                return
            }

            code := http.StatusOK
            switch {
            case os.IsNotExist(err): // 如果是文件不存在类型
                // 如果是文件不存在
                // 给出403 响应
                code = http.StatusForbidden
            default:
                code = http.StatusInternalServerError
            }

            http.Error(writer, "文件不存在", code)
        }
    }
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:爱吃豆包

查看原文:golang-统一异常处理

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3535 次点击  
加入收藏 微博
下一篇:golang-接口
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传