Я хочу провести рефакторинг в направлении конструкции, в которой:
- Бизнес-логика не использует исключения для ожидаемых сбоев
- Исключения обнаруживаются только на границах приложения (например, промежуточного программного обеспечения API или задания) бегуны)
- Методы возвращают явные значения успеха/неудачи
- Ошибки могут распространяться вверх по стеку вызовов типизированным способом
Код: Выделить всё
public User GetUser(int id)
{
try
{
var user = _repo.Find(id);
if (user == null)
throw new NotFoundException();
return user;
}
catch(Exception ex)
{
_logger.LogError(ex, "Failed");
throw;
}
}
Код: Выделить всё
public record Result(bool IsSuccess, T? Value, string? Error);
Код: Выделить всё
public Result GetUser(int id)
{
var user = _repo.Find(id);
if (user == null)
return new Result(false, null, "NotFound");
return new Result(true, user, null);
}
Код: Выделить всё
var result = service.GetUser(id);
if (!result.IsSuccess)
return NotFound(result.Error);
return Ok(result.Value);
Какие шаблоны или методы проектирования позволяют использовать этот стиль распространения типизированных ошибок в C#?
В частности, как я могу структурировать эти типы результатов и сигнатуры методов, чтобы ошибки последовательно передавались вверх, не требуя try/catch в каждом методе?
Подробнее здесь: https://stackoverflow.com/questions/798 ... out-scatte
Мобильная версия