Golang panic 捕获异常打印堆栈信息

  前言

  习惯了java的try catch方式,由于go语言中没有try catch机制,所以自己封装了一个。

 

  代码

   Exception.go

package try

import (
	"bytes"
	"fmt"
	"runtime"
)

/**
* 捕获异常try...catch
* 用法示例:
  defer try.CatchException(func(e interface{}) {
      log.Println(e)
  })
*/
func CatchException(handle func(e interface{})) {
    if err := recover(); err != nil {
        e := printStackTrace(err)
        handle(e)
    }
}

// 打印堆栈信息
func printStackTrace(err interface{}) string {
    buf := new(bytes.Buffer)
    fmt.Fprintf(buf, "%v\n", err)
    for i := 1; ; i++ {
        pc, file, line, ok := runtime.Caller(i)
        if !ok {
            break
        }
        fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc)
    }
    return buf.String()
}

   main.go

package main

import (
    "./try"
    "log"
)

func main() {
    defer try.CatchException(func(e interface{}) {
        log.Println(e)
    })

    zero := 0
    x := 3 / zero
    fmt.Println("x=", x)
}

   输出信息

    能够看出问题出在main.go:14的 x := 3 / zero这一行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值