2016-03-30 2 views
0

В моем проекте WebApi 2 я отслеживаю шаблон обслуживания, а также единицу работы и общие шаблоны репозитория.Catch SqlException на уровне контроллера?

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

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

У меня также есть собственный класс DatabaseException, который захватывает исключения базы данных EF, брошенные на SaveChanges, и это отлично работает.

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

Должен ли я использовать эти исключения на уровне хранилища, уровне обслуживания или уровне контроллера?

+1

Повторите как можно ближе к его происхождению. Таким образом, вы все равно сможете отличить, если хотите. – Stefan

+0

Мое предложение состоит в том, чтобы регистрировать исключение на уровне контроллера и выдавать исключение из общего сообщения от контроллера. – Prasanth

ответ

1

Чтобы ответить на ваш вопрос - я бы воспользовался исключениями на уровне обслуживания, зарегистрировал их, а затем повторно бросил.

  • Извлечение данных из базы данных является функцией службы, поэтому, если это не удается, это не работает служба.
  • Приложение не «знает» о базе данных. Он не получает данные из базы данных. Он получает данные от службы. Он не должен зависеть от деталей реализации в сервисе, например, как данные поступают из SQL или где-то еще.

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

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

+0

Ошибки, возникающие в контексте, будут распространяться до вашего BAL или модели, где вы вызываете _context. . Если эти функции завернуты в try-catch, вы поймаете исключение. Когда вы инициализируете контекст в операторе using, он поймает ваши конкретные ошибки соединения. – Kentonbmax

+0

Я имел в виду «контекст» в более смутном смысле - исключение, возникшее при обработке запроса в контроллере. –

0

Обычно я не try_catchs в моих приложениях MVC (за исключением одного или двух существующих попробовать Фиксаторы)

Все мои контроллеры унаследованной от BaseController где я атрибут, поймать это все исключения в моем приложении :

public class HandleExceptionsAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     filterContext.Exception.InsertIntoDB(Membership.CurrentUserId, filterContext.RouteData.Values["controller"].ToString(), filterContext.RouteData.Values["action"].ToString()); 
    } 
} 

[HandleExceptionsAttribute(View = "/Error/Index")] 
public class BaseController : Controller 
{ 
    // Code... 
} 

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

Если вы хотите, чтобы отфильтровать конкретные исключения:

if (filterContext.Exception is EntityCommandExecutionException) 
       // code 

ПРИМЕЧАНИЕ

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

Смежные вопросы