Как я могу реализовать последовательное распространение типизированных ошибок в C# без разбрасывания попыток/улова по слC#

Место общения программистов C#
Anonymous
Как я могу реализовать последовательное распространение типизированных ошибок в C# без разбрасывания попыток/улова по сл

Сообщение Anonymous »

У меня есть приложение C# с несколькими уровнями (контроллеры, службы, логика предметной области и фоновые рабочие процессы). Обработка ошибок стала непоследовательной, поскольку многие методы содержат собственные блоки try/catch. Некоторые ошибки регистрируются, другие всплывают, а третьи проглатываются, что усложняет обслуживание и тестирование системы.
Я хочу провести рефакторинг в сторону дизайна, в котором:
  • Бизнес-логика не использует исключения для ожидаемых сбоев
  • Исключения обнаруживаются только на границах приложения (например, промежуточного программного обеспечения 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

Вернуться в «C#»