如何解决如何从Nim中的异常获取堆栈跟踪?
有一个getStackTrace()
函数可以从当前异常中获取堆栈跟踪。
但是它不适用于特定的异常,此代码将error.getStackTrace()
不起作用
log
功能需要它
proc error*(message: string,exception: Exception): void =
stderr.write_line fmt" {message}"
stderr.write_line exception.getStackTrace()
解决方法
您的示例代码甚至没有为我编译,因为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()
当我编译并运行该程序时,将得到以下输出:
$ ./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
请注意,getStackTrace() documentation提到它在非调试版本中没有提供太多信息:
$ 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。