В Rust я считаю, что идиоматический способ справиться с восстанавливаемыми ошибками - использовать Result. Например, эта функция явно идиоматична:
fn do_work() -> Result<u64, WorkError> {...}
Конечно, есть также функции, которые имеют одно, очевидное, состояние отказа и, следовательно, вместо этого используют тип Option. Идиоматическим примером может быть следующее:
fn do_work() -> Option<u64>
Все это прямо рассматривается в документации. Однако я смущен тем случаем, когда функция может терпеть неудачу, но при этом не имеет значимой ценности. Сравните следующие две функции:
fn do_work() -> Option<WorkError>
// vs
fn do_work() -> Result<(), WorkError>
Я просто не уверен, какой из них более идиоматичен или используется чаще в коде рвения реального мира. Мой ресурс для таких вопросов, как книга Rust, но я не думаю, что это описано в разделе Обработка ошибок". Мне также не повезло с другими документами Rust.
Конечно, это кажется довольно субъективным, но я ищу авторитетные источники, которые либо заявляют, что форма идиоматична, либо почему одна форма превосходит (или уступает) другой. (Мне также любопытно, как соглашение сравнивается с другими языками, которые в значительной степени используют "ошибки как значения", такие как Go и Haskell.)