Здравствуйте, Ночной Смотрящий, Вы писали:
vaa>>vaa>>Result result = new Result.Ok("OK");
vaa>>WriteLine(result switch
vaa>>{
vaa>> Result.Ok x => "200 " + x.Result,
vaa>> Result.Error e => "400 " + e.Err
vaa>>});
vaa>>public record Result()
vaa>>{
vaa>> public record Ok(string Result) : Result();
vaa>> public record Error(string Err) : Result();
vaa>>}
vaa>>
НС>ЧТД. Ровно 100% этого кода при использовании исключений можно выкинуть.
не совсем. Result — может быть библиотечным/инфраструктурным.
вместо свитча — будет try/catch. я бы сказал примерно одно и тоже.
в общем случае исключения конечно удобнее (когда не надо каждый вызов функции хэндлить и обрабатывать ошибку), за счет меньшего шума и доп бойлерплейта.
паттерн Result лучше, когда ошибочная ситуация ожидаема и часть штатного поведения, в этом случае лучше и перф (иногда это важно).
и мы точно знаем все ожидаемые исходы из самого типа результата.
решается и исходная проблема топика — неоднозначность места исключения (возникло ли оно внутри самой функции и то что мы и хотим словить либо из более глубоких недр).
ввод нового класса исключения по бойлерплейту будет примерно тоже что ввод нового класса Result для конкретного случая.