前言
習慣了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
這一行。