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這一行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章