Исключения в методах в MVC3 - PullRequest
0 голосов
/ 09 декабря 2011

Я попробовал следующий код:

   if (vm.SubmitAction == "Delete")
    {
    throw new DivideByZeroException(); // LOCATION A
    return View();
    accountTable.Delete(vm.Account);
   }

   if (Session["CurrentUrl"] != null ) // LOCATION B
     {

Нажав на Delete, я попаду в МЕСТО А. Когда я затем использую F11, он идет рядом с МЕСТОПОЛОЖЕНИЕМ B, а затем вызывает и исключение:

System.DivideByZeroException не было обработано кодом пользователя Сообщение = попытка деления на ноль.

Может кто-нибудь объяснить, почему он не идет на return View() или просто выйти из действия?

Ответы [ 4 ]

4 голосов
/ 09 декабря 2011

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

MVC получил встроенный атрибут, используемый для обработки ошибок.Это называется [HandleError].Но это не позволяет продолжить действие, но не дает ASP.NET отображать желтый экран.

Типичная попытка / отлов в действиях после публикации выглядит следующим образом:

[HttpPost]
public virtual ActionResult Create(YourModel model)
{
  if (!ModelState.IsValid)
    return View(model);

  try
  {
    var dbEntity = _repository.Get(model.Id);
    Mapper.Map(model, dbEntity);
    _repository.Save(dbEntity);

    return RedirectToAction("Details", new { id = model.Id });
  }
  catch (Exception ex)
  {
    ModelState.AddModelError("", ex.Message);
    //log error here.
    return View(model);
  }
}

Вы можетеПодробнее об ошибках в MVC читайте в моем блоге .

1 голос
/ 09 декабря 2011

Исключение является одним из возможных способов завершения блока кода.Это означает, что внутри одного и того же блока кода ничего после «throw» или «return» никогда не будет выполнено.Если вы компилируете это, вы должны получить предупреждение «Обнаружен недоступный код».

По причине, по которой он попадает в местоположение B, это, конечно, странно, но я не могу уточнить, почему только с предоставленной вами информацией.

1 голос
/ 09 декабря 2011

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

Посмотрите здесь:

http://msdn.microsoft.com/en-us/library/ms173163.aspx

Причинаон жалуется на то, что исключение не было обработано, потому что это не так.

0 голосов
/ 09 декабря 2011

Это очень просто: поскольку ваше исключение не находится внутри блока try-catch, происходит проверка стека, и поток управления переходит к функции, предшествующей функции, которая вызвала исключениестек вызовов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...