我尝试了以下代码:
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()
或只是退出行动吗?
答案 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'块中,所以会发生堆栈检查,并且控制流转到函数之前的函数,这会引发异常,调用堆栈