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