3 回答

TA貢獻1775條經驗 獲得超11個贊
我們可以使用該runtime/debug包。
package main
import (
? ? "fmt"
? ? "runtime/debug"
)
func main() {
? ? defer func() {
? ? ? ? if r := recover(); r != nil {
? ? ? ? ? ? fmt.Println("stacktrace from panic: \n" + string(debug.Stack()))
? ? ? ? }
? ? }()
? ? var mySlice []int
? ? j := mySlice[0]
? ? fmt.Printf("Hello, playground %d", j)
}
印刷
stacktrace from panic:?
goroutine 1 [running]:
runtime/debug.Stack(0x1042ff18, 0x98b2, 0xf0ba0, 0x17d048)
? ? /usr/local/go/src/runtime/debug/stack.go:24 +0xc0
main.main.func1()
? ? /tmp/sandbox973508195/main.go:11 +0x60
panic(0xf0ba0, 0x17d048)
? ? /usr/local/go/src/runtime/panic.go:502 +0x2c0
main.main()
? ? /tmp/sandbox973508195/main.go:16 +0x60

TA貢獻1876條經驗 獲得超6個贊
創建一個日志文件以將堆棧跟蹤添加到 stdout 或 stderr 的文件中。這將在文件中添加包括時間和錯誤行的數據。
package main
import (
"log"
"os"
"runtime/debug"
)
func main() {
defer func() {
if r := recover(); r != nil {
log.Println(string(debug.Stack()))
}
}()
//create your file with desired read/write permissions
f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
log.Println(err)
}
//set output of logs to f
log.SetOutput(f)
var mySlice []int
j := mySlice[0]
log.Println("Hello, playground %d", j)
//defer to close when you're done with it, not because you think it's idiomatic!
f.Close()
}
Go 操場上的工作示例

TA貢獻1801條經驗 獲得超16個贊
這是將恐慌轉換為錯誤的解決方案,堆棧跟蹤將像任何其他錯誤一樣被記錄
package main
import (
"fmt"
"github.com/pkg/errors"
)
func wrong() int {
var mySlice []int
return mySlice[0]
}
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Printf("Error: %+v", errors.New(fmt.Sprintf("%v", r)))
}
}()
fmt.Printf("Hello, playground %d", wrong())
}
去游樂場輸出
Error: runtime error: index out of range [0] with length 0
main.main.func1
/tmp/sandbox2058999152/prog.go:17
runtime.gopanic
/usr/local/go-faketime/src/runtime/panic.go:884
runtime.goPanicIndex
/usr/local/go-faketime/src/runtime/panic.go:113
main.wrong
/tmp/sandbox2058999152/prog.go:11
main.main
/tmp/sandbox2058999152/prog.go:21
runtime.main
/usr/local/go-faketime/src/runtime/proc.go:250
runtime.goexit
/usr/local/go-faketime/src/runtime/asm_amd64.s:1594
Program exited.
- 3 回答
- 0 關注
- 149 瀏覽
添加回答
舉報