Работа с необработанным HttpException
У меня есть действие контроллера, как это:
public ActionResult Index(string url)
{
var pageTitle = url.Split('/')[0];
var page = Services.PageService.GetPage(pageTitle);
if (page == null)
{
throw new HttpException((Int32) HttpStatusCode.NotFound, "NotFound");
}
return View(page);
}
Каждый раз, когда я отлаживаю свой сайт, когда возникает исключение HttpException, я получаю приглашение от Visual Studio, уведомляющее меня о том, что исключение не было обработано кодом пользователя.
Я думаю, я просто хочу, чтобы кто-то разъяснил, что то, что я делаю, правильно, и что это уведомление может быть отклонено без беспокойства. Событие все еще всплывает до метода Application_Error в моем файле Global.asax, где я на самом деле обрабатываю HttpException, поэтому, насколько я могу судить, единственная проблема заключается в неудобстве VS, сообщающего мне каждый раз, когда выдается это исключение.
2 ответа
Я думаю, я просто хочу, чтобы кто-то разъяснил, что то, что я делаю, правильно, и что это уведомление может быть отклонено без беспокойства.
Да, то, что вы видите, называется исключением первого шанса. Отладчик VS уведомляет вас обо всех исключениях, возникающих в вашем коде. Если у вас есть правильный обработчик для этого исключения, у вас все будет хорошо.
Я предполагаю, что вы хотите вернуть http-код (в данном случае 404) пользователю / потребителю вашей страницы. Так что лучше сделать это:
public ActionResult Index(string url)
{
var pageTitle = url.Split('/')[0];
var page = Services.PageService.GetPage(pageTitle);
if (page == null)
{
return new HttpNotFoundResult();
}
return View(page);
}
HttpNotFoundResult - это новый ActionResult в asp.net-mvc3, также есть защищенный метод HttpNotFound()
как часть класса контроллера, который делает то же самое. В обоих случаях вы также можете указать строку сообщения.
Возвращение ActionResult также более изящно, я думаю, с точки зрения юнит-тестирования.