2017-02-07 10 views
0

У меня есть простое приложение WebApi, которое представляет собой хранилище пользователей. У меня есть слои DAL и BLL. Я использую ExceptionFilters для обработки исключений.Должен ли я использовать утверждения try/catch на более низких уровнях моего приложения WebApi?

public class HandleExceptionsAttribute : ExceptionFilterAttribute 
    { 
     private readonly ILogger logger; 

     public HandleExceptionsAttribute(ILogger logger) 
     { 
      this.logger = logger; 
     } 

     public override void OnException(HttpActionExecutedContext context) 
     { 
      logger.LogError(context.Exception); 
     } 
    } 

Он записывает мое исключение в файл журнала. Должен ли я использовать инструкции try/catch на моих нижних уровнях (DAL, BLL)? Я получил совет, чтобы как можно больше свести к минимуму «try catch». Я думаю, что мне нужно исключить мои исключения, пока они не появляются на уровне контроллера. Поскольку я предполагаю, что это означает, что я должен использовать инструкции try/catch в моем слое DAL. Я должен исключить исключения из уровня BLL и исключить исключения из уровня контроллера. Похоже, это:

DAL слой

public class UserRepository 
    { 
     public IEnumerable<User> GetAll() 
     { 
      IEnumerable<User> users; 

      try 
      { 
       users = context.GetUsers(); 
      } 
      catch(SomeSpecificException specExc) 
      { 
       throw specExc; 
      } 
      catch(Exception exc) 
      { 
       throw exc; 
      } 
     } 
    } 

BLL слой

public class UserService 
    { 
     public IEnumerable<User> GetAllUsers() 
     { 
      IEnumerable<Users> users; 

      try 
      { 
       users = userRepository.GetAll(); 
      } 
      catch(PreviousSpecificException specExc) 
      { 
       throw specExc; 
      } 
      catch(OneMoreSpecificException sExc) 
      { 
       throw sExc; 
      } 
      catch(Exception exc) 
      { 
       throw exc; 
      } 
     } 
    } 

Это выглядит не очень хорошо. Могу ли я отказаться от использования всех моих заявлений try/catch и предоставить ExceptionFilters все работать?

+1

Обработка исключений с выделением и освобождением (исключение только для повторного выброса) - это плохая идея. В лучшем случае предложения catch ничего не делают. В худшем случае, как здесь, когда вы пишете 'throw ex'', а не просто« бросаете », вы потенциально разрушаете полезную информацию о трассировке стека. –

ответ

1

Я думаю, что это в первую очередь основано на мнениях, но вы должны обрабатывать исключения только в том случае, если у вас есть потребность в дизайне. Регистрация необходима разработчику.

Я вижу в одном из ваших комментариев, что вы хотите сделать «довольно сообщение об ошибке». Это совершенно необходимо для дизайна, но для слоя пользовательской панели вашей программы, поэтому вы не должны обрабатывать исключения в вашем BLL. (ну, реальная потребность в дизайне заключается в том, что вы не хотите, чтобы ваша программа рушилась при первом исключении, которое вы выбрали, но вы получите точку)

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

Конечно, вы всегда можете попробовать/поймать в своем BLL, если вам нужно, но rethrow новое исключение, с оригинальным как его InnerException.

1

Вы должны применить блок Try/улова, следуя этим вопросы

  1. Хотите «Handle» исключение на конкретном слое? Это означает, что вы хотите предоставить любую альтернативу или любой журнал и т. Д., Когда возникает ошибка ?
  2. Вы единственный, кто собирается поглотить этот слой? Если кто-то еще может потреблять ваш BAL или DAL, как он узнает, произошло ли какое-либо исключение в вашем BAL или DAL.

Если вы не хотите ничего делать в BAL/DAL при возникновении исключения, вам не следует использовать блоки try catch. Если вы хотите, чтобы внешний слой должен обрабатывать исключение, «исключение» должно появиться на внешнем слое, а внешний слой должен попробовать/поймать.

+0

В моем случае я хочу обработать это исключение и вернуть ответ с целью его обработки в пользовательском интерфейсе и сделать сообщение об ошибке. –

+2

Если вы не хотите ничего делать на уровне DAL или BAL (например, повторная попытка или ведение журнала и т. Д.) Вы можете пропустить блоки try/catch из DAL/BAL. Исправляйте исключение в своем контроллере и играйте с ответом соответственно. – BilalS