golang 列印error的堆疊資訊操作

2022-09-21 10:33:12 字數 2123 閱讀 1367

眾所周知,目前的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...