Как я могу получить трассировку стека из исключения в Nim?

#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