Tcl не имеет заранее определенной иерархии исключений. Команда throw принимает 2 аргумента: type
- список слов; и message
- сообщение об ошибке для людей.
Вы можете сделать что-то вроде
proc getJobinfo {question} {
...
if {$cleanedanswer eq ""} {
throw {Value Empty} "Please provide a suitable answer."
} elseif {[string length $cleanedanswer] < 5} {
throw {Value Invalid} "Your answer is too short."
} else ...
return $cleanedanswer
}
Если вы хотите перехватить эту ошибку:
try {
set answer [getJobinfo "What is the answer to this question"]
} trap {Value *} msg {
puts "Value Error: $msg"
}
throw
и try
взаимодействуют с помощью слов type
вызова throw
. Выбрасываем «Значение пусто» или «Значение недействительно». В ловушке мы точно соответствуем Value
, но не можем точно соответствовать *
. Оглядываясь назад, *
там быть не должно. Справочная страница try
не очень понятна при первом чтении:
trap шаблон variableList script
Это предложение соответствует, если оценка body привела к ошибке и префиксу -errorcode из состояния интерпретатора словарь равен шаблону . Количество префиксных слов, взятых из кода ошибки , равно длине списка шаблона , а межсловные пробелы нормализованы как в коде ошибки , и образец перед сравнением.
образец не является образцом в смысле regexp
или string match
: это список слов который последовательно сопоставляется со списком слов, выданных в try body .
try
может быть реализован с несколькими ловушками для каскадных «ловушек»:
try {
set answer [getJobinfo "What is the answer to this question"]
} trap {Value Empty} msg {
do something specific here
} trap {Value Invalid} msg {
do something specific here
} trap {Value} msg {
do something general for some other "throw {Value anything} msg"
} on error e {
this can be default catch-all for any other error
} finally {
any cleanup code goes here
}