#nim-lang
#nim-lang
Вопрос:
Есть getStackTrace()
функция, которая получает трассировку стека из текущего исключения.
Но это не работает для конкретного исключения, этот код не будет работать error.getStackTrace()
Мне это нужно для log
функции
proc error*(message: string, exception: Exception): void =
stderr.write_line fmt" {message}"
stderr.write_line exception.getStackTrace()
Ответ №1:
Ваш пример кода даже не компилируется для меня, поскольку getCurrentException возвращает ссылку на исключение, а не его копию, поэтому нет способа передать его 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 () упоминается, что она не предоставляет много информации в сборках без отладки:
$ 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