Как я могу реализовать последовательное распространение типизированных ошибок в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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