Ошибки: 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 — весь цикл, а не упавший элемент.
Как путешествует ошибка¶
- Исчерпываются собственные политики
retryузла. - Ошибка всплывает к ближайшему объемлющему блоку
try, и её забирает первый обработчик, чейerror_equalsподошёл. - Ошибка, под которую не подошёл никто, всплывает дальше и наружу из сессии —
исключение вылетает из
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, и возвращает
результатом, а не исключением.