Обработка ошибок

Argenta выбрасывает исключения в пограничных случаях, связанных с пользовательским вводом. По умолчанию они обрабатываются системными обработчиками, но вы можете их переопределить. Это делается с помощью сеттеров экземпляра App вида .set_*_handler(). Подробнее о каждом из них рассказано ниже.

Примечание

Ни одно исключение не остаётся необработанным, так как для каждого случая предусмотрен стандартный обработчик. Поэтому переопределение является опциональным.

Пример использования:

1from argenta import App
2
3def empty_command_handler():
4    print("Empty command handler called")
5
6app: App = App()
7app.set_empty_command_handler(empty_command_handler)

Возможные исключения и нестандартное поведение

UnprocessedInputFlagException: Некорректный синтаксис флагов

Это исключение выбрасывается, когда парсер не может обработать команду из-за некорректного синтаксиса. Чаще всего это связано с ошибкой в синтаксисе флагов. Подробнее о них можно прочитать в разделе Flags.

Стандартный обработчик выводит в консоль:

Incorrect flag syntax: <raw input command>

Для переопределения используется сеттер .set_incorrect_input_syntax_handler(). Он принимает на вход обработчик с сигнатурой Callable[[str], None], где единственный аргумент — это строка с необработанной командой.

Пример использования:

1from argenta import App
2
3def incorrect_input_syntax_handler(raw_command: str):
4    print(f"Incorrect input syntax for command: {raw_command}")
5
6app: App = App()
7app.set_incorrect_input_syntax_handler(incorrect_input_syntax_handler)

RepeatedInputFlagsException: Повторяющиеся флаги в команде

Исключение выбрасывается, если пользователь ввёл команду с повторяющимися флагами. Два флага (InputFlag) считаются одинаковыми, если у них совпадают имена. Подробнее о флагах и их синтаксисе — в разделе Flags.

Примечание

Сравнение на равенство у регистрируемых флагов (Flag) происходит иначе, подробнее в Flag.

Стандартный обработчик выводит в консоль:

Repeated input flags: <raw input command>

Для переопределения используется сеттер .set_repeated_input_flags_handler(). Он принимает на вход обработчик с сигнатурой Callable[[str], None], где единственный аргумент — это строка с необработанной командой.

Пример использования:

1from argenta import App
2
3def repeated_input_flags_handler(raw_command: str):
4    print(f"Repeated input flags: {raw_command}")
5
6app: App = App()
7app.set_repeated_input_flags_handler(repeated_input_flags_handler)

EmptyInputCommandException: Введена пустая команда

Исключение выбрасывается, если пользователь ввёл пустую строку или строку, состоящую только из пробельных символов (\n, \t, пробел и т.д.).

Стандартный обработчик выводит в консоль:

Empty input command

Для переопределения используется сеттер .set_empty_command_handler(). Он принимает на вход обработчик с сигнатурой Callable[[], None] (без аргументов).

Пример использования:

1from argenta import App
2
3def empty_command_handler():
4    print("Empty input command")
5
6app: App = App()
7app.set_empty_command_handler(empty_command_handler)

Обработка неизвестной команды

Это поведение активируется, когда пользователь вводит команду, которая не зарегистрирована ни в одном из роутеров и не является псевдонимом (alias) для существующей команды.

Стандартный обработчик выводит в консоль:

Unknown command: <trigger of the input command>

Для переопределения используется сеттер .set_unknown_command_handler(). Он принимает на вход обработчик с сигнатурой Callable[[InputCommand], None], где аргумент — объект InputCommand.

Пример использования:

1from argenta import App
2from argenta.command import InputCommand
3
4def unknown_command_handler(command: InputCommand):
5    print(f"Unknown input command with trigger: {command.trigger}")
6
7app: App = App()
8app.set_unknown_command_handler(unknown_command_handler)

Выход из приложения

Это поведение активируется, когда пользователь вводит команду, помеченную как команда выхода.

Стандартный обработчик выводит в консоль текст и завершает работу приложения:

See you

Для переопределения используется сеттер .set_exit_command_handler(). Он принимает на вход обработчик с сигнатурой Callable[[Response], None], где аргумент — объект Response.

Пример использования:

1from argenta import App, Response
2
3def exit_command_handler(response: Response):
4    print("Exit command handler")
5
6app: App = App()
7app.set_exit_command_handler(exit_command_handler)