OxL Справочник OxL
РусскийEnglish

6.5 Ошибки

Исключений нет. Ошибка — значение типа, помеченного @error, возвращаемое через объединение.

oxl
@error data NotFound { what: str }
@error enum PayError { Declined(reason: str), Fraud }

fn charge(card: Card, sum: Money) -> Receipt | PayError | NetError  net {
  let token = Vault.tokenize(card)?          // ? пробрасывает ошибки вызова
  if sum <= Money.zero() { fail PayError.Declined("zero sum") }
  Bank.pay(token, sum)
}
  • fail e возвращает ошибку e из функции; тип e ДОЛЖЕН входить в возвращаемый тип.
  • e? для e: T | E1 | …: при ошибке возвращает её из функции, иначе даёт T. Ошибки ДОЛЖНЫ входить в возвращаемый тип функции.
  • e? для e: T? (без ошибок) возвращает none из функции, возвращающей опционал.
  • Обязательная обработка. Выражение-инструкция, тип которого содержит @error-тип, — ошибка компиляции. Обработка: match, ?, !>, if … is, присваивание переменной, которая затем обрабатывается, или явный отброс _ = e.
  • Сетевые ошибки. Каждый вызов rpc, сообщения актора и операции кластера добавляет к результату NetError:
oxl
type NetError = Timeout | Unavailable | Cancelled | AccessDenied | ProtocolError

ProtocolError — @error data ProtocolError { msg: str, code: i32 }, где code — код статуса gRPC. Записи ProtocolError.Internal (§6.6), ProtocolError.InvalidArgument (§9.4) и ProtocolError.Unimplemented — ассоциированные константы-значения этого типа с кодами 13, 3 и 12; их можно сравнивать и сопоставлять так же, как варианты (D-8052; DIV-004; D-2901).

Результат кластерной операции содержит NetError, если операция обращается к другим узлам и может не дождаться ответа: из операций cluster.* (§12.6) так устроены lock и lockFenced; операции, выполняемые локально (self, members, find, pick, leader, ids, now, shards), NetError не добавляют (D-7520).

  • Трасса: в профилях с trace = true каждое ? добавляет к ошибке кадр (функция, файл, строка); доступна как err.trace().

fail-type, question-context, unhandled-error

См. также

Исходник: docs/spec/oxl-standard.md