try
Имя
try — Перехват и обработка ошибок и исключенийСинопсис
try тело ?обработчик...? ?finally скрипт?Описание
Эта команда выполняет скрипт тело и, в зависимости от результата этого скрипта (нормальный выход, ошибка или какое-либо другое исключительное событие), запускает скрипт обработчика для обработки случая. После этого, если присутствует блок finally, будет выполнен скрипт скрипт, и результат обработчика (или тела, если не нашлось совпадающего обработчика) будет разрешен к дальнейшему распространению. Обратите внимание, что блок finally обрабатывается даже если произошла ошибка и независимо от того, какой (если есть) обработчик используется.Блоки обработчик выражаются несколькими словами и должны иметь один из следующих форматов:
- on код переменныеСписок скрипт
- Этот блок совпадает, если выполнение тела завершилось с кодом исключения код. Код может быть выражен как целое число или одним из следующих литеральных слов: ok, ошибка, возврат, прервать или продолжить. Эти литералы соответствуют целым числам от 0 до 4 соответственно.
- trap шаблон переменныеСписок скрипт
- Этот блок совпадает, если выполнение тела привело к ошибке, и префикс -errorcode из словаря состояния интерпретатора равен шаблону. Количество префиксных слов, взятых из -errorcode, равно длине списка шаблон, а пробелы между словами в -errorcode и шаблоне нормализуются перед сравнением.
Слово переменныеСписок в каждом обработчике всегда интерпретируется как список имён переменных. Если первое слово списка присутствует и не пустое, оно назначает переменную, в которую будет помещён результат выполнения тела (из основного try); в неё будет помещён удобочитаемый вид любых ошибок. Если второе слово списка присутствует и не пустое, оно назначает переменную, в которую будет помещён словарь опций интерпретатора на момент завершения выполнения тела.
Слово скрипт каждого обработчика также всегда интерпретируется одинаково: как скрипт Tcl для проверки соответствия блока. Если скрипт является литералом «-» и обработчик не последний, то вместо него вызывается скрипт следующего обработчика (точно так же, как и с командой switch).
Обратите внимание, что блоки обработчик проверяются в порядке следования, и всегда выбирается первый соответствующий блок. Максимально один блок обработчик будет выбран. Вследствие этого, on error будет маскировать любые последующие trap в try. Также обратите внимание, что on error эквивалентно trap {}.
Если во время выполнения либо обработчика, либо блока finally произойдёт исключение (т.е. любой результат, не равный ok), словарь состояния исходного исключения будет добавлен в словарь состояния нового исключения под ключом -during.
Примеры
Убедитесь, что файл закрывается независимо от обстоятельств:set f [open /some/file/name a]
try {
puts $f "some message"
# ...
} finally {
close $f
} Обработайте различные причины, по которым файл не может быть открыт для чтения:
try {
set f [open /some/file/name w]
} trap {POSIX EISDIR} {} {
puts "failed to open /some/file/name: it's a directory"
} trap {POSIX ENOENT} {} {
puts "failed to open /some/file/name: it doesn't exist"
} См. также
catch, ошибка, возврат, throw
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/try.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/try.htm