Spec-Zone.ru › Tcl/Tk

catch

Имя

catch — Выполнить скрипт и перехватить исключительные возвраты

Синтаксис

catch script ?resultVarName? ?optionsVarName?

Описание

Команда catch может использоваться для предотвращения прерывания интерпретации команд из-за ошибок. Команда catch рекурсивно вызывает интерпретатор Tcl для выполнения script и всегда возвращает значение без поднятия ошибки, независимо от ошибок, которые могут возникнуть при выполнении script.

Если script вызывает ошибку, catch вернёт ненулевое целое значение, соответствующее исключительный код возврата, полученный при оценке script. Tcl определяет нормальный код возврата от оценки скрипта как ноль (0) или TCL_OK. Tcl также определяет четыре исключительных кода возврата: 1 (TCL_ERROR), 2 (TCL_RETURN), 3 (TCL_BREAK) и 4 (TCL_CONTINUE). Ошибки во время оценки скрипта обозначаются кодом возврата TCL_ERROR. Другие исключительные коды возврата возвращаются командами return, break и continue, а также в других особых ситуациях, как документировано. Пакеты Tcl могут определять новые команды, которые возвращают другие целые значения в качестве кодов возврата, а скрипты, использующие команду return -code, также могут иметь коды возврата, отличные от пяти определённых Tcl.

Если аргумент resultVarName указан, то переменная с этим именем устанавливается в результат оценки скрипта. Когда код возврата скрипта равен 1 (TCL_ERROR), значение, хранящееся в resultVarName, является сообщением об ошибке. Когда код возврата скрипта равен 0 (TCL_OK), значение, хранящееся в resultVarName, — это значение, возвращённое script.

Если аргумент optionsVarName указан, то переменная с этим именем устанавливается в словарь параметров возврата, возвращённых при оценке script. Tcl определяет два всегда существующих элемента в словаре: -code и -level. Когда код возврата от оценки script не равен TCL_RETURN, значение элемента -level будет 0, а значение элемента -code будет таким же, как код возврата. Только когда код возврата равен TCL_RETURN, значения элементов -level и -code будут иными, как подробно описано в документации для команды return.

Когда код возврата от оценки script равен TCL_ERROR, в словаре параметров возврата, хранящемся в optionsVarName, определяются четыре дополнительных элемента: -errorinfo, -errorcode, -errorline и -errorstack. Значение элемента -errorinfo представляет собой отформатированный стек вызовов, содержащий более подробную информацию о контексте возникновения ошибки. Отформатированный стек вызовов предназначен для чтения человеком. Значение элемента -errorcode — это дополнительная информация об ошибке, хранящаяся как список. Значение -errorcode предназначено для дальнейшей обработки программами и может не быть особо удобным для чтения людьми. Значение элемента -errorline — это целое число, указывающее строку script, которая оценивалась при возникновении ошибки. Значение элемента -errorstack — это список чётной длины, составленный из пар "токен-параметр", собранных при разворачивании стека. Токен может быть "CALL", в этом случае параметром является список, состоящий из имени и аргументов процедуры на соответствующем уровне; или это может быть "UP", в этом случае параметр — это относительный уровень (как в uplevel) предыдущего CALL. Существенные отличия от -errorinfo заключаются в том, что:

  1. это машиночитаемый формат, подходящий для обработки с помощью [foreach {tok prm} ...],
  2. он содержит истинные (заменённые) значения, переданные функциям, а не статический текст мест вызова, и
  3. он более грубый, с одним элементом на кадр стека (как процедуры; нет отдельных элементов для конструкций foreach, например).

Значения элементов -errorinfo и -errorcode последней ошибки также доступны как значения глобальных переменных ::errorInfo и ::errorCode соответственно. Значение элемента -errorstack отображается как info errorstack.

Пакеты Tcl могут предоставлять команды, которые устанавливают другие элементы в словаре параметров возврата, а команда return может использоваться скриптами для установки параметров возврата помимо вышеуказанных.

Примеры

Команда catch может использоваться в if для ветвления на основе успешности скрипта.
if { [catch {open $someFile w} fid] } {
    puts stderr "Could not open $someFile for writing\n$fid"
    exit 1
}

Более сложные примеры использования catch представлены в документации для команды return.

См. также

break, continue, dict, error, errorCode, errorInfo, info, return

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/catch.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/catch.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API