MVC3中方法中的异常

本文关键字:异常 方法 MVC3 | 更新日期: 2023-09-27 18:17:12

我尝试了以下代码:

   if (vm.SubmitAction == "Delete")
    {
    throw new DivideByZeroException(); // LOCATION A
    return View();
    accountTable.Delete(vm.Account);
   }
   if (Session["CurrentUrl"] != null ) // LOCATION B
     {

点击删除把我带到位置A。当我使用F11步进时,它会转到LOCATION B旁边,然后引发一个异常:

系统。DivideByZeroException未被用户代码处理消息=试图除以零。

谁能解释一下为什么它不去return View()或简单地退出动作?

MVC3中方法中的异常

例外就是这样。例外。有些事情没有按计划进行。因此,该方法不能按计划继续进行。相反,应用程序沿着调用堆栈查找处理异常的catch块。如果没有找到catch块,则应用程序崩溃。

MVC获得了一个用于处理错误的内置属性。它叫做[HandleError]。但是它并没有让动作继续,而是阻止了ASP。. NET从显示黄屏。

post中典型的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);
  }
}

你可以在我的博客中阅读更多关于MVC的错误。

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

看这里:

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

它抱怨异常没有被处理的原因是它没有被处理。

抛出异常是终止代码块的一种可能方法。这意味着,在同一代码块中,"throw"或"return"之后的任何内容都不会被执行。如果你编译,你应该得到一个"检测到不可达代码"的警告。

到达位置B的原因确实很奇怪,但仅凭您提供的信息,我无法详细说明原因。

这很简单:因为你的异常不在'try-catch'块内,堆栈检查发生,控制流进入函数,这是在函数之前,引发异常,在调用堆栈