6.5 Ошибки
Исключений нет. Ошибка — значение типа, помеченного @error, возвращаемое через объединение.
@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:
type NetError = Timeout | Unavailable | Cancelled | AccessDenied | ProtocolErrorProtocolError — @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