前言

  习惯了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:14x := 3 / zero