>> try/catch ты можешь не писать, и исключение продолжит разматывать стек.
> Как будто From для Result это бесплатно, открываешь машинный код и видно,
> что теперь везде есть ветки проверки результата на Ok и если
> не Ok, то вызов From, а затем return с результатом преобразования.
> Чем это тебе не разматывание стека? :) Точно также получается кучка
> преоборазований поэтапно с возвратом в каждую функцию выше и дропом всего,
> что надо дропнуть.В rust'е обработка Result'ов проверяется на этапе компиляции компилятором.
> С исключениями теоретически и на практике это может быть не нужно, например
> если в Java ты бросаешь исключение без заполнения stack trace, а
> это легко сделать, то фактически будет выполнен переход сразу на тот
> try catch какой надо. Весь стек ниже будет просто выброшен без
> пустопорожних преобразований как в Result и From.
А это как раз неудобно. Вот смотри, тебе вылетела ошибка FileNotFound. Ты поймал её в main. И чё?
Твой код, парсящий toml/json/что-то ещё из файла, может не знать, как надо правильно реагировать на FileNotFound. Где-то чуть выше по стеку всё равно не ясно, но зато семантика ошибки другая, скажем ConfigFileDoesntExist. А ещё несколькими стековыми фреймами выше всё очень просто -- надо не читать Config из файла, а создать дефолтный.
Если ты присмотришься к ошибке разматывающей стек и примеришь её к каждому стековому фрейму, ты увидишь что смысл ошибки меняется по мере размотки. И Result позволяет это отметить в ошибке с минимум накладных расходов. Даже From писать не обязательно, всегда можно сделать map_err. Вот когда map_err получаются большими -- там хорошо вынести их логику в impl From.
>[оверквотинг удален]
> А если тебе надо обработать ошибку, то будет уже иное:
> if let Err(e) = method() {
> } else {
> }
> Может быть match менее многословно?
> match mathod() {
> Ok(_) => {}
> Err(_) => {}
> }
> Да по мне таже фигня.
Я согласен, что checked exception в java по семантике то же самое, что и Result. Различия только в синтаксисе и в деталях реализации.
А насчёт многословности, if let, и match редко нужны для Result'а, как правило оно разруливается иными путями. То есть нужно иногда, и очень полезно в тех случаях, но это редко случается. if let и match описываются в туториалах, потому что это способы общего назначения. Как и что будет сделано в частном случае -- сложно описать или даже перечислить подходы. Это уже от тебя зависит: тебе следует почитать доку на Result и посмотреть что он позволяет сделать с ошибкой.
Например, обработка ошибки может выглядеть так:
let config = read_config_file().unwrap_or(Config::default());
Или если ты сделал
impl Default for Config { ... }
то можно так:
let config = read_config_file().unwrap_or_default();