Files
Argenta/docs/root/error_handling.rst
T
2025-11-01 11:38:48 +03:00

149 lines
9.1 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
.. _root_error_handling:
Стандартная обработка ошибок
==========================================
О разделе
------------
``Argenta`` в рантайме вызывает исключения в пограничных случаях пользовательского ввода.
Все исключения обрабатываются системными хэндлерами, но у вас есть возможность их переопределить. Переопределение осуществляется
с помощью сеттеров инстанса ``App`` - ``.set_*_handler(_)``, где ``_`` - это протокол хэндлера нестандартного поведения, подробнее
о каждом протоколе и соответствующем сеттере :ref:`ниже <possible_errors>`
.. note::
Все исключения никогда не остаются необработанными, так как у них есть стандартные хэндлеры. Поэтому переопределение опционально.
Краткий сэмпл кода, переопределяющего хэндлер ввода
пустой команды
.. literalinclude:: ../code_snippets/error_handling/snippet.py
:language: python
:linenos:
.. _possible_errors:
Возможные исключения и нестандартное поведение
----------------------------------------------
``UnprocessedInputFlagException``: Необрабатываемый ввод от пользователя
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Исключение вызывается, когда пользователь вводит команду с некорректным синтаксисом и как следствие парсер не может
*распарсить* её. В большинстве случаев это означат, что проблема в синтаксисе введённых флагов команды, подробнее о
флагах и их синтаксисе в :ref:`Flags <root_flags>`.
Дефолтный хэндлер выводит в консоль
.. code-block:: shell
Incorrect flag syntax: <raw input command>
Для переопределения стандартного поведения используется сеттер ``.set_incorrect_input_syntax_handler(_: NonStandardBehaviorHandler[str])``,
протокол ``NonStandardBehaviorHandler[str]`` соответствует ``Callable[[str], None]``, то есть хэндлер должен быть вызываемым объектом,
к примеру функция или лямбда, которая принимает единственный аргумент - строку, которая представляет собой необработанную введённую команду, и ничего не возвращает.
Сэмпл кода, переопределяющего хэндлер ввода команды с некорректным синтаксисом:
.. literalinclude:: ../code_snippets/error_handling/snippet2.py
:language: python
:linenos:
---------------
``RepeatedInputFlagsException``: Повторяющийся флаг в введённой команде
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Исключение вызывается, когда пользователь вводит команду с повторяющимся флагом, пара введённых флагов(:ref:`InputFlag <root_api_command_input_flag>`) считается
равной, если у них одинаковые имена. Подробнее о флагах и их синтаксисе в :ref:`Flags <root_flags>`.
.. note::
Сравнение на равенство у регистрируемых флагов(Flag) происходит иначе, подробнее в :ref:`Flag <root_flags>`.
Дефолтный хэндлер выводит в консоль
.. code-block:: shell
Repeated input flags: <raw input command>
Для переопределения стандартного поведения используется сеттер ``.set_repeated_input_flags_handler(_: NonStandardBehaviorHandler[str])``,
протокол ``NonStandardBehaviorHandler[str]`` соответствует ``Callable[[str], None]``, то есть хэндлер должен быть вызываемым объектом,
к примеру функция или лямбда, которая принимает единственный аргумент - строку, которая представляет собой необработанную введённую команду, и ничего не возвращает.
Сэмпл кода, переопределяющего хэндлер ввода команды с повторяющимися флагами:
.. literalinclude:: ../code_snippets/error_handling/snippet3.py
:language: python
:linenos:
---------------
``EmptyInputCommandException``: Введена пустая команда
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Исключение вызывается, когда пользователь вводит команду в виде строки из пробельных символов - ``\n``, ``\t``, пробел и т.д.
Дефолтный хэндлер выводит в консоль
.. code-block:: shell
Empty input command
Для переопределения стандартного поведения используется сеттер ``.set_empty_command_handler(_: EmptyCommandHandler)``,
протокол ``EmptyCommandHandler`` соответствует ``Callable[[], None]``, то есть хэндлер должен быть вызываемым объектом,
к примеру функция или лямбда, которая не принимает аргументов и ничего не возвращает.
Сэмпл кода, переопределяющего хэндлер ввода пустой команды:
.. literalinclude:: ../code_snippets/error_handling/snippet4.py
:language: python
:linenos:
---------------
``Поведение обработки неизвестной команды``: Введена неизвестная команда
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Поведение триггерится, когда пользователь вводит команду, которая не зарегистрирована ни в одном роутере и не является алиасом ни для
одной зарегистрированной команды.
Дефолтный хэндлер выводит в консоль
.. code-block:: shell
Unknown command: <trigger of the input command>
Для переопределения стандартного поведения используется сеттер ``.set_unknown_command_handler(_: NonStandardBehaviorHandler[InputCommand])``,
протокол ``NonStandardBehaviorHandler[InputCommand]`` соответствует ``Callable[[InputCommand], None]``, то есть хэндлер должен быть вызываемым объектом,
к примеру функция или лямбда, которая принимает обязательный аргумент типа :ref:`InputCommand <root_api_command_input_command>` и ничего не возвращает.
Сэмпл кода, переопределяющего хэндлер ввода неизвестной команды:
.. literalinclude:: ../code_snippets/error_handling/snippet5.py
:language: python
:linenos:
---------------
``Поведение выхода из приложения``: Введена команда выхода
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Поведение триггерится, когда пользователь вводит команду, которая маркирована как команда завершения работы.
Дефолтный хэндлер выводит в консоль текст и завершает работу приложения.
.. code-block:: shell
See you
Для переопределения стандартного поведения используется сеттер ``.set_exit_command_handler(_: NonStandardBehaviorHandler[Response])``,
протокол ``NonStandardBehaviorHandler[Response]`` соответствует ``Callable[[Response], None]``, то есть хэндлер должен быть вызываемым объектом,
к примеру функция или лямбда, которая принимает обязательный аргумент типа :ref:`Response <root_api_response>` и ничего не возвращает.
Сэмпл кода, переопределяющего хэндлер ввода команды выхода:
.. literalinclude:: ../code_snippets/error_handling/snippet6.py
:language: python
:linenos: