如何从 Nim 异常中获取堆栈跟踪?

Ale*_*hin 5 nim-lang

有一个getStackTrace()函数可以从当前异常中获取堆栈跟踪。

但它不适用于特定异常,此代码将不起作用error.getStackTrace()

我需要它来实现log功能

proc error*(message: string, exception: Exception): void =
    stderr.write_line fmt"      {message}"
    stderr.write_line exception.getStackTrace()
Run Code Online (Sandbox Code Playgroud)

Grz*_*icz 4

您的示例代码甚至无法为我编译,因为getCurrentException返回对 Exception 的引用而不是它的副本,因此无法将其传递给error(). 这是为我编译的完整示例:

proc failHard() =
    doAssert toInt(1.49) == 0

proc error*(message: string, exception: ref Exception) =
    echo message
    echo exception.getStackTrace()

proc main() =
    try: failHard()
    except: error("oops", getCurrentException())

main()
Run Code Online (Sandbox Code Playgroud)

当我编译并运行该程序时,我得到以下输出:

$ ./t
oops
/private/tmp/t/t.nim(12) t
/private/tmp/t/t.nim(9)  main
/private/tmp/t/t.nim(2)  failHard
/Users/gradha/.choosenim/toolchains/nim-1.2.6/lib/system/assertions.nim(29) failedAssertImpl
/Users/gradha/.choosenim/toolchains/nim-1.2.6/lib/system/assertions.nim(22) raiseAssert
/Users/gradha/.choosenim/toolchains/nim-1.2.6/lib/system/fatal.nim(49) sysFatal
Run Code Online (Sandbox Code Playgroud)

请注意,getStackTrace() 文档提到它在非调试版本中没有提供太多信息:

$ nim c -d:release -r t.nim 
Hint: used config file '/Users/gradha/.choosenim/toolchains/nim-1.2.6/config/nim.cfg' [Conf]
Hint: 320 LOC; 0.096 sec; 5.379MiB peakmem; Release build; proj: /private/tmp/t/t.nim; out: /private/tmp/t/t [SuccessX]
Hint: /private/tmp/t/t  [Exec]
oops
fatal.nim(49)            sysFatal
Run Code Online (Sandbox Code Playgroud)