Самый простой подход - это проанализировать переменную 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"
}
}
Обратите внимание, что просто знаяоткуда возникла ошибка, не обязательно говорит вам, где проблема, особенно в производственном коде, поскольку это может быть связано с неверными аргументами в другом месте, которые были переданы немного ...