Добавить команду обратного вызова при любой ошибке tcl в скрипте tcl?

#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