MVC3中方法的例外情况

时间:2011-12-09 09:47:24

标签: c# asp.net-mvc-3

我尝试了以下代码:

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

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

点击删除将我带到LOCATION A. 当我接着使用F11时,它会转到LOCATION B旁边,然后引发和异常:

  

System.DivideByZeroException未被用户代码处理     消息=尝试除以零。

有人可以解释为什么它不会转到return View()或只是退出行动吗?

4 个答案:

答案 0 :(得分:4)

例外就是这样。例外。有些东西没有按计划进行。因此,该方法不能按计划继续。相反,应用程序向上移动调用堆栈以找到将处理异常的catch块。如果未找到catch块,则应用程序崩溃。

MVC获得了用于处理错误的内置属性。它被称为[HandleError]。但它不会让操作继续,但它会阻止ASP.NET显示黄色屏幕。

后期操作中的典型try / catch如下所示:

[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);
  }
}

您可以在my blog中了解有关MVC中错误的更多信息。

答案 1 :(得分:1)

当你抛出异常时,它会立即离开你的方法,所以永远不会执行下面的代码。

看看这里:

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

它抱怨未处理异常的原因是因为它不是。

答案 2 :(得分:1)

异常抛出是终止代码块的可能方法之一。意思是,在同一个代码块内," throw"或者"返回"将永远不会被执行。如果你编译它,你应该得到一个"无法访问的代码"警告。

由于它到达位置B的原因肯定很奇怪,但我不能仅仅根据您提供的信息详细说明原因。

答案 3 :(得分:0)

这非常简单:因为你的异常不在'try-catch'块中,所以会发生堆栈检查,并且控制流转到函数之前的函数,这会引发异常,调用堆栈