• 【GoLang】GoLang 错误处理 -- 异常处理思路示例


    代码:

    package main
    
    import (
        "fmt"
        //    "testing"
    )
    
    var Pkg = "packageName"
    
    type Err struct {
        Pkg  string
        Info string
        Prev error
    }
    
    func (e *Err) Error() string {
        if e.Prev == nil {
            return fmt.Sprintf("%s: %s", e.Pkg, e.Info)
        }
        return fmt.Sprintf("%s: %s
    %v", e.Pkg, e.Info, e.Prev)
    }
    
    func me(err error, format string, args ...interface{}) *Err {
        if len(args) > 0 {
            return &Err{
                Pkg:  Pkg,
                Info: fmt.Sprintf(format, args...),
                Prev: err,
            }
        }
        return &Err{
            Pkg:  Pkg,
            Info: format,
            Prev: err,
        }
    }
    
    func ce(err error, format string, args ...interface{}) {
        if err != nil {
            panic(me(err, format, args...))
        }
    }
    
    func ct(err *error) {
        if p := recover(); p != nil {
            if e, ok := p.(error); ok {
                *err = e
            } else {
                panic(p)
            }
        }
    }
    
    func oe(e error) error {
        var ret error = e
        for err, ok := ret.(*Err); ok && err.Prev != nil; err, ok = ret.(*Err) {
            ret = err.Prev
        }
        return ret
    }
    
    func foo() (err error) {
        defer ct(&err)
        ce(bar(), "call bar")
        return
    }
    
    func bar() (err error) {
        defer ct(&err)
        ce(baz(), "call baz")
        return
    }
    
    func baz() (err error) {
        return me(nil, "baz")
    }
    
    func main() {
        ce(foo(), "call foo")
    }

    输出:

    panic: packageName: call foo
    packageName: call bar
    packageName: call baz
    packageName: baz
    
    goroutine 1 [running]:
    panic(0x491000, 0xc420016300)
        /opt/golang/go/src/runtime/panic.go:500 +0x1a1
    main.ce(0x4f9140, 0xc4200162d0, 0x4a741f, 0x8, 0x0, 0x0, 0x0)
        /opt/golang/workspace/src/github.com/junneyang/letsgo/error_test/error_common.go:40 +0x97
    main.main()
        /opt/golang/workspace/src/github.com/junneyang/letsgo/error_test/error_common.go:79 +0x69
    Error: process exited with code 2.

    参考资料:

    http://reusee.github.io/post/error-handling/

    https://github.com/reusee/codes/blob/master/err/err.go

    https://github.com/golang/go/blob/master/src/encoding/gob/error.go

  • 相关阅读:
    .Net中通过反射技术的应用插件程序的开发入门
    html超链接button
    WCF 跨域 Http绑定
    在ASP.NET MVC中修改默认代码生成/支架模板
    使用Lambda表达式重构委托
    使用公用表表达式(CTE)简化嵌套SQL
    WCF同域动态绑定服务地址
    WCF 跨域TCP绑定
    Silverlight 基础收集
    WCF服务控制台托管方法(不使用配置文件)
  • 原文地址:https://www.cnblogs.com/junneyang/p/6093137.html
Copyright © 2020-2023  润新知