眾所周知,目前的golang error只關注error()資訊,而不關注它的堆疊路徑,對錯誤的定位大多數通過
log.setflags(log.llongfile| log.lstdflags)
log.println(e)
一旦**分層,為了定位錯誤,可能出現每乙個層次的同乙個error,都得log好幾次,比epwmkjw如:
func db()error
func dao()error
return nil
}func service()error
return nil
}func control()error
return nil
}以模擬一次請求-分發-服務-資料庫操作為例:
執行結果:
stacktrace | causedby
g:/go_workspace/gopath/src/errorx/example/main.go: 26 | connect to mysql time out
g:/go_workspace/gopath/src/errorx/example/main.go: 34 | connect to mysql time out
g:/go_workspace/gopath/src/errorx/example 42 | inner service error,please call admin for help
補充:golang 異常退出堆疊捕獲
利用golang自帶包 runtime/debug 異常時列印
package main
import (
"fmt"
"os"
"runtime/debug"
"time"
)func trye()
exename := os.args[0] //獲取程式名稱
now := time.now() //獲取當前時間
pid := os.getpid() //獲取程序id
time_str := now.format("20060102150405") //設定時間格式
fname := fmt.sprintf("%s-%d-%s-dump.log", exename, pid, time_str) //儲存錯誤資訊檔名:程式名-程序id-當前時間(年月日時分秒)
fmt.println("dump to file ", fname)
f, err := os.create(fname)
if err != nil
defer f.close()
f.writestring(fmt.sprintf("%v\r\n", errs)) //輸出panic資訊
f.writestring("*****===\r\n")
f.writestring(string(debug.stack())) //輸出堆疊資訊
}package main
import (
"fmt"
"time"
)func main()
檢視堆疊可以定位main 裡第11行丟擲異常-2.
本文標題: golang 列印error的堆疊資訊操作
本文位址:
golang 用defer 捕獲error 需小心
有時乙個函式內需要根據最後是否出錯,決定是否執行某個操作。這時候如果函式的分支又比較多,就會比較麻煩了。defer 處理這個情況剛好合適 func main err err errors.new hi,beautiful girl byerr err func byerr err error els...
Java Exception和Error的區別
error類和exception類的父類都是throwable類,他們的區別是 error類一般是指與虛擬機器相關的問題,如系統崩潰,虛擬機器錯誤,記憶體空間不足,方法呼叫棧溢等。對於這類錯誤的導致的應用程式中斷,僅靠程式本身無法恢復和和預防,遇到這樣的錯誤,建議讓程式終止。exception類表示...
插入和列印功能完備的二項堆
其中在union時時候故意加的wrap head很有意義,另外列印階段採用的是深度優先,還能列印合理的層數.include include define nil 9999 typedef struct binheap binheap binheap newconstruct int key binh...