#tcl #tk
#tcl #tk-toolkit
Вопрос:
Возможно ли указать пользовательскую команду при ошибке в скрипте tcl? Я хочу очистить память, если появится какая-либо ошибка. Я знаю, что последняя ошибка сохраняется в переменной errorInfo.
Ответ №1:
Не совсем ясно, чего вы на самом деле хотите.
Вы можете перехватить любую ошибку, используя catch
команду. Если вам нужно, чтобы это работало на верхнем уровне, вы можете оценить остальную часть вашего скрипта в catch
разделе, например в
catch {
source ./the_rest_of_the_code.tcl
} err
Для асинхронных программ (использующих цикл событий, включая Tk) это не так просто, поскольку при обратных вызовах могут возникать неожиданные ошибки. Чтобы разобраться с ними, посмотрите на bgerror
команду.
Комментарии:
1. Поскольку мы не можем добавить catch к полному коду, «bgerror» — это способ что-то сделать. Мне нужна просто какая-нибудь сложная система ошибок в tcl. спасибо, что дали представление о bgerror.
Ответ №2:
Другой альтернативой является использование трассировки выполнения в режиме leavestep, который позволяет проверить, не завершилась ли каждая выполненная команда ошибкой, и определить, что делать, если это произойдет. (Это очень похоже на то, что вы можете делать с определенными типами аспектов в AOP.)
proc doIt {} {
namespace eval :: {
# Your real code goes in here
}
}
trace add execution doIt leavestep {::apply {{cmd cmdArgs code result op} {
if {$code == 1} {#0 == ok, 1 == error
puts "ERROR >>$result<< from $cmdArgs"
}
}}}
doIt
Хотя это довольно медленно.
Ответ №3:
Вы также можете определить процедуру bgerror и вызвать свой код в качестве фоновой задачи:
proc bgerror { msg } {
puts "bgerror:$msg"
# Cleanup code here
}
proc troubleCode { } {
adjsad s ahda
}
after 1 troubleCode