Nano Hash - криптовалюты, майнинг, программирование

Стратегия обработки исключений — перехват исключений из репозитория и передача в контроллер WebApi.

Простите меня за мое невежество, но в данный момент я изо всех сил пытаюсь найти лучший подход для перехвата исключения и отображения сообщения клиенту на основе типа исключения.

Моя архитектура:

Репозиторий

Page IPageRepository.FindDefault()
{
    try
    {
        return MapPageFromCategory.MapFromEntity(_context.tbl_Category.
                             FirstOrDefault(p =>
                                                p.IsLandingPage == true
                                            )
                     );
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Error getting values from database :", ex);
    }
}

С приведенным выше, как вы можете видеть, он просто извлекает данные из БД, но в некоторых сценариях я мог получить object not set to an instance of an object exception из-за физического отсутствия данных в таблице или Null exception в зависимости от переданных данных.

Теперь в обоих сценариях я хотел бы создать исключение 404, которое передается моему контроллеру.

Контроллер

 public class PageController : ApiController
 {
   private IPageRepository _pageRepository;
   public PageController(IPageRepository pageRepository)
   {
      this._pageRepository = pageRepository;
   }
   // GET
   [HttpGet]
   [Route("")]
   public Page Get()
   {
       return this._pageRepository.FindDefault();
   }
}

Мой контроллер использует метод, и если какое-либо из этих исключений сработает, как лучше всего перехватить эти исключения и передать их конечному клиенту (вызывающему приложению)?

Еще раз извиняюсь за вопрос, действительно пытаюсь создать какой-то систематический подход к обработке исключений.

Спасибо за ваше время!

20.09.2016

  • Прочтите Раздражающие исключения Эрика Липперта. это может помочь вам сформулировать наилучший подход. 20.09.2016
  • Является ли _context типом DbContext? Если да, я бы предложил создать контекст в каждом методе Repository. Потому что вы можете оказаться в странных ситуациях, если несколько потоков попытаются использовать один и тот же _context. 20.09.2016
  • @Gabrielius Да, это мой контекст сущностей, который происходит от DbContext. Мой базовый класс (Generic EntityRepository) создает экземпляр Context, а в моем производном классе (PageRepository) он извлекается из базы и передается в Ctor, в котором я использую IoC, создавая таким образом новый экземпляр для этого репо. 20.09.2016
  • @Enigmativity Спасибо, я сейчас посмотрю на это. 20.09.2016
  • @TezWingfield, если вы настроили IoC для создания нового экземпляра типа, который наследует IPageRepository каждый раз, когда вам это нужно, проблем не должно быть. То есть новый PageRepository, который создает объект типа Context при создании экземпляра для каждого веб-запроса. В противном случае вы можете столкнуться с проблемами :) 20.09.2016
  • @Gabrielius Приветствую вас! 20.09.2016
  • @TezWingfield, без проблем, сам наступил на эти грабли в прошлом ;) 20.09.2016

Ответы:


1

Вы можете либо иметь отдельный try/catch в классе Controller и обрабатывать там исключение, выброшенное из репозитория, либо сделать что-то другое.

Вы можете создать класс, подобный этому:

public class Result
{
    public bool Succeded { get; private set; }

    protected Result(bool succeeded)
    {
        Succeded = succeeded;
    }
}

public class Result<TData> : Result
{
    public TData Data { get; private set; }

    protected Result(bool succeeded, TData data) : base(succeeded)
    {
        Data = data;
    }
}    

Затем вы можете вернуть это из своего репозитория и проверить в контроллере, успешно ли выполнен вызов. Если нет, сгенерируйте желаемое исключение, которое соответствующим образом установит StatusCode.

20.09.2016
  • Я использовал аналогичный процесс - не точный, но похожий. Ссылка в одном из комментариев помогла мне определить лучший подход. Спасибо за ваше время. 20.09.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..