Перейти к содержанию

Ошибки: retry и try/except

Два механизма, намеренно разделённые. Повтор — свойство операции, поэтому retry это поле узла. Перехват — свойство области, поэтому это отдельный узел, блок try.

retry

{
  "id": "fetch",
  "type": "stage",
  "stage": "HttpGetStage",
  "retry": [
    { "error_equals": ["TimeoutError"], "max_attempts": 3, "interval_seconds": 1.0,
      "backoff_rate": 2.0, "max_delay_seconds": 30 }
  ],
  "next": "parse"
}
Поле По умолчанию Что значит
error_equals ["*"] за какие ошибки отвечает эта политика
max_attempts 3 прогонов вместе с первым: 3 — это один прогон и два повтора
interval_seconds 1.0 пауза перед первым повтором
backoff_rate 2.0 каждая следующая пауза умножается на это
max_delay_seconds нет потолок паузы

retry — список, и у каждой политики свой счётчик: узел может быть терпелив к TimeoutError и сразу сдаваться на всём остальном. Отвечает первая политика, чей error_equals подошёл.

retry принимает любой тип узла, и повторяется всегда узел целиком: для subpipeline — весь дочерний прогон, для map — весь цикл, а не упавший элемент.

Как путешествует ошибка

  1. Исчерпываются собственные политики retry узла.
  2. Ошибка всплывает к ближайшему объемлющему блоку try, и её забирает первый обработчик, чей error_equals подошёл.
  3. Ошибка, под которую не подошёл никто, всплывает дальше и наружу из сессии — исключение вылетает из session.run().

Внутри узла parallel первая упавшая ветка поднимает BranchError; внутри цикла map ошибка элемента поднимается как есть.

Исключения ядра

Каждая ошибка StageFlow наследует StageFlowError и встроенный тип, так что except ValueError продолжает работать в коде, который про этот пакет ничего не знает:

Исключение Ещё и Когда поднимается
PipelineDefinitionError ValueError JSON не описывает пайплайн
PipelineValidationError ValueError validate() собрал проблемы
StageContractError ValueError стадия нарушила собственный контракт
StageOutputError KeyError запрошенное выходное поле не вернули
ArtifactNotFoundError KeyError субпайплайн не вернул артефакт
ExpressionError RuntimeError CEL-выражение не вычислилось
BranchError RuntimeError ветка parallel упала или две писали одно имя
TypeCheckError TypeError значение не совпало с объявленным типом
TypeDeclarationError ValueError сломаны сами объявления типов
PayloadValidationError ValueError payload события или ввода не прошёл схему
RegistryError ValueError неизвестная стадия или тип узла
PolicyViolationError PermissionError стадия или тип узла, не разрешённые политикой

Одна ошибка намеренно вне этого дерева. BudgetExceeded наследует BaseException, поэтому except Exception его не видит, и блоки try с машинкой повторов тоже, — бюджет, который пайплайн способен поймать, никакой не бюджет. Ловит его одно место, Session.run, и возвращает результатом, а не исключением.