Чтение вывода отладчика в Komodo IDE для Tcl Languare - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь понять ошибки и исключения в Tcl. Я написал небольшой код следующим образом

proc Div3 {a b} {
    return [Div2 $a $b]
}

proc Div2 {a b} {
    return [Div $a $b]
}

proc Div {a b} {
   if {$b == 0} {
      error "Error generated by error" "Info String for error" 401
   } else {
      return [expr $a/$b]
   }
}

if {[catch {puts "Result = [Div3 10 0]"} errmsg]} {
   puts "ErrorMsg: $errmsg"
   puts "ErrorCode: $errorCode"
   puts "ErrorInfo:\n$errorInfo\n"
}

, когда я запускаю его с помощью tclsh.exe, вывод отладчика отображается следующим образом:

% tclsh error-file-1.tcl
ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
    (procedure "Div" line 1)
    invoked from within
"Div $a $b"
    (procedure "Div2" line 2)
    invoked from within
"Div2 $a $b"
    (procedure "Div3" line 2)
    invoked from within
"Div3 10 0"

Однако, когда я запускаю тот же используя tclsh.exe через Komodo IDE , я получаю вывод отладчика следующим образом

ErrorMsg: Error generated by error
ErrorCode: 401
ErrorInfo:
Info String for error
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"Div $a $b"
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"Div2 $a $b"
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"Div3 10 0"
    invoked from within
"DbgNub_uplevelCmd 1 $cmd"
    invoked from within
"DbgNub_Do 0 {1 17 {249 27}} {puts "Result = [DbgNub_Do 1 {1 17 {265 9}} {Div3 10 0}]"}"

Я могу понять вывод отладчика из tclsh.exe, но не могу интерпретировать выходные данные отладчика из Komodo IDE .

особенно, я не могу понять DbgNub_Do 0 {1 17 {249 27}} {puts "Result = [DbgNub_Do 1 {1 17 {265 9}} {Div3 10 0}]"}, какие числа отображаются в списках (то есть {1 17 {249 27}}) и DbgNub_uplevelCmd 1 $cmd и DbgNub_Do

Заранее спасибо

1 Ответ

1 голос
/ 23 марта 2020

Все команды DbgNub_, упомянутые в трассировке стека, являются дополнительными инструментами отладки Komodo (скрыть их в трассировке стека теоретически возможно, но грязно и инструментарий , очевидно, фактически не делает этого ). Как правило, вы, вероятно, игнорируете эти команды, поскольку их не будет при развертывании.

Если мы игнорируем DbgNub_uplevelCmd бит, мы получим:

Info String for error
    invoked from within
"Div $a $b"
    invoked from within
"Div2 $a $b"
    invoked from within
"Div3 10 0"
    invoked from within
"DbgNub_Do 0 {1 17 {249 27}} {puts "Result = [DbgNub_Do 1 {1 17 {265 9}} {Div3 10 0}]"}"

Это очень похоже к стандартной трассировке, за исключением отсутствия информации о номере строки (и DbgNub_Do, который, очевидно, является инструментом для кода внутри catch напрямую).


Как правило, статус результата Tcl состоит из:

  1. Результат код . Это TCL_OK (= 0) при успешном выполнении фрагмента кода, TCL_ERROR (= 1), если было сгенерировано исключение, и несколько других значений для других вещей (TCL_RETURN, TCL_BREAK и TCL_CONTINUE ). Эти имена определены на уровне C.
  2. Результат значение , хранящийся в интерпретаторе. В древних версиях Tcl это была простая строка, но это было типизированное значение с подсчетом ссылок более 20 лет. (У Tcl есть система типов. Она очень сильно отличается от всех остальных языков тем, что строки являются супертипом всех других типов.)
  3. Результат словарь , который содержит дополнительную информацию. Стандартные записи (можно также определить свои собственные) в этом:
    1. Информация об ошибке, то есть трассировка стека, которая записывается в глобальный errorInfo для поддержки старого кода. Только действительно значимо для ошибок.
    2. Код ошибки, машиночитаемый дескриптор исключения, который записывается в глобальный errorCode для поддержки старого кода. Опять же, только действительно значимо для ошибок.
    3. Строка ошибки. Бит, используемый для генерации числа в сообщении (procedure "Div" line 1) и т. Д.
    4. Уровень, используемый return для многоуровневого возврата.

Есть некоторые другие фрагменты, которые включаются только в нескольких случаях (например, когда предложение try *1050* вызывает исключение, когда тело исключения выбрасывает, грубый случай в лотах языков).

...