Какое исключение должно выдаваться при пустом вводе пользователя? - PullRequest
1 голос
/ 06 мая 2020

Я искал какое-то время и уверен, что пропустил это, есть ли документация, в которой указано, что следует выдавать, если значение неверно / пусто?

Например , Python имеет ValueError, и в документации четко указано, когда его использовать.

У меня есть следующий метод:

proc getJobinfo {question} {
    puts -nonewline "$question: "
    flush stdout
    gets stdin answer
    set cleanedanswer [string trim [string totitle $answer]]
    if {$cleanedanswer eq ""} {
       # What error should be thrown?
    }
    return $cleanedanswer
}

Я искал throw, error и catch, но не смог найти.

1 Ответ

1 голос
/ 06 мая 2020

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
}
...