Как я могу получить номер строки кода вместе с errorinfo, но до 8.5? - PullRequest
0 голосов
/ 01 октября 2019

Я использую следующий код TCL:

proc RunCSM { scen } {
                catch { $scen start }
                if { "[$scen status]" != "SUCCESS" } {
                        puts "$scen FAILED.  Error Info:"
                        puts "[$scen errorInfo]" ...

Мне также нужен номер строки кода, который дает сбой. В 8.5 и далее это достигается этим хорошим решением Как я могу получить номер строки кода вместе с errorinfo?

Как можно достичь того же, но в версии 8.4?

1 Ответ

2 голосов
/ 01 октября 2019

Самый простой подход - это проанализировать переменную errorInfo. Вот как выглядит пример:

% parray foo
"foo" isn't an array
% set errorInfo
"foo" isn't an array
    while executing
"error "\"$a\" isn't an array""
    (procedure "parray" line 4)
    invoked from within
"parray foo"

Анализ, который с regexp не слишком сложен, при условии, что мы используем опцию -line.

proc getLineFromErrorInfo {} {
    global errorInfo
    if {[regexp -line { line (\d+)\)$} $errorInfo -> line]} {
        return $line
    } else {
        # No guarantee that there's information there...
        return "unknown"
    }
}

На нашем примере израньше мы можем сделать:

getLineFromErrorInfo

и он вернет 4. Возможно, вы захотите расширить RE, чтобы также захватить имя процедуры;номера строк в 8.4 и ранее всегда относятся к их процедуре. (Это также в основном верно в 8.5 и далее; в этой области обратная совместимость немного болезненна для ИМО.) Вот как вы можете это сделать:

proc getLocusFromErrorInfo {} {
    global errorInfo
    if {[regexp -line {\(procedure "(.*?)" line (\d+)\)$} $errorInfo -> proc line]} {
        return [list $proc $line]
    } else {
        # No guarantee that there's information there...
        return "unknown"
    }
}

Обратите внимание, что просто знаяоткуда возникла ошибка, не обязательно говорит вам, где проблема, особенно в производственном коде, поскольку это может быть связано с неверными аргументами в другом месте, которые были переданы немного ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...