当前位置: 首页 > news >正文

【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\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

相关文章:

  • Tower 实战一:MavLink的连接与通信
  • hive 数据清理--数据去重
  • rails生成器生成自定义controller模板
  • 关于适配器中设置显示与隐藏的问题
  • 递归的例子
  • 各种居中对齐
  • 面向对象 封装 、继承
  • [学习笔记]背包问题(一)
  • SQL 基础语法(一)
  • HTTP慢速DOS(slow http denial of service attack)
  • PAT甲题题解-1104. Sum of Number Segments (20)-(水题)
  • Java 8 Lambda表达式,让你的代码更简洁
  • 使用scrapy创建工程
  • 文件属性
  • 插入排序
  • CAP理论的例子讲解
  • co.js - 让异步代码同步化
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • javascript数组去重/查找/插入/删除
  • node.js
  • Python连接Oracle
  • React 快速上手 - 07 前端路由 react-router
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Webpack 4 学习01(基础配置)
  • 力扣(LeetCode)22
  • 你不可错过的前端面试题(一)
  • 浅谈Golang中select的用法
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 转载:[译] 内容加速黑科技趣谈
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​【已解决】npm install​卡主不动的情况
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #Ubuntu(修改root信息)
  • #传输# #传输数据判断#
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (3)选择元素——(17)练习(Exercises)
  • (6)设计一个TimeMap
  • (done) 两个矩阵 “相似” 是什么意思?
  • (js)循环条件满足时终止循环
  • (超详细)语音信号处理之特征提取
  • (二)windows配置JDK环境
  • .htaccess 强制https 单独排除某个目录
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET Reactor简单使用教程
  • .net 按比例显示图片的缩略图
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • []Telit UC864E 拨号上网
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C++]——带你学习类和对象
  • [C++核心编程](四):类和对象——封装
  • [C++基础]-初识模板