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

本文介绍了一个自定义错误处理包的设计与实现,通过示例代码展示了如何在Go语言中优雅地处理错误,包括错误的创建、传递及捕获。

代码:

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\n%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

 

转载于:https://www.cnblogs.com/junneyang/p/6093137.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值