mirror of
https://github.com/koloideal/Argenta.git
synced 2026-06-10 10:05:28 +03:00
149 lines
9.1 KiB
ReStructuredText
149 lines
9.1 KiB
ReStructuredText
.. _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:
|