我不确定HandleError的不同方法之间有什么区别。
在asp.net mvc(默认项目)中,他们把它放在了类
之上[的HandleError]
所以我正在阅读一些博客,而这个人说这个
“....告诉框架,如果你的控制器发生了未处理的异常,而不是显示默认的黄色死亡屏幕,它应该提供一个名为Error的视图。”
http://blog.dantup.me.uk/2009/04/aspnet-mvc-handleerror-attribute-custom.html
那么这是否意味着我不应该捕捉任何错误(即没有尝试捕获)?
然后我在看书,他们有
[HandleError(ExceptionType=typeof(InsufficientMemoryException),View="About")]
public ActionResult HandleError()
{
throw new
InsufficientMemoryException();
return View("Home");
}
所以他们只是把它放在这个ActionResult之上并给它一个异常类型。我的第一个问题是,如果你有一个以上的错误,你会发生什么?我还以为你应该处理所有错误。我知道这只是一个小例子,但你不应该在某处捕获MemoryException或者如果你这样做会搞砸“HandleError”吗?
我在VS中看到它时也注意到HandleError有2个重载方法。其中一个是上面的,另一个是HandError()。
那么为什么asp.net MVC示例文件只是[HandleError]而不是[HandleError()]?一个用于行动方法,一个用于课堂方法?我假设HandleError在类1的顶部就像HandleError(typeof(Exception))?
最后有一个名为IExceptionFilter的东西。如果您想记录所有异常,或者如果您想要以不同的方式执行某些特殊异常,则使用此方法?
就像我只是想记录所有异常一样,无论我只是制作其中的一个,那就是它,但是如果我想在NullReferenceexception做一些特别的事情,我会再做一个吗?
我正在看这个教程http://dimecasts.net/Casts/CastDetails/37,我没有看到他们正在谈论的这个“ActionFilterAttribute”。这是旧版本还是什么?
就像显然它有4种方法可以使用,你必须覆盖它们。在我的书中,它只涉及这些:
它们都是接口所以没有覆盖。不是他们虽然有4种方法。只有一个或两个。
由于
哦还有一件事。你应该总是测试每一个例外吗?像我的一个方法可以遇到7个不同的例外。我应该测试所有7个异常(即抛出它们)然后最终捕获它们并处理它们(我通常只是打印出一些消息)。
如果是这样的话,VS2008会发现可能发生异常的事情。我发现很难说有什么可以抛出异常,然后我必须追捕哪些。
答案 0 :(得分:2)
首先要注意的是,您应该始终捕获可能发生的错误。接下来,你不应该试图捕获人类已知的每一个错误......你可能整天都在你的代码中添加这些东西。 [HandleError]属性本质上是一个全局错误处理程序,它表示如果在此控制器中发生任何错误,则将它们发送到已配置的页面。这是很好的开箱即用,你很好地处理所有错误!接下来就是以某种方式处理特定错误。您可以说是否发生XYZ错误转到此页面而不是全局处理的错误页面。如果发生多个错误......第一个错误。这意味着如果您计划捕获两种类型的错误...首先出现的错误将控制您重定向的页面。
您可以考虑的任何asp.net网站(webforms或mvc)的下一件事是ELMAH框架。它将记录并捕获您的站点导致的每个错误。这将帮助您解决您不知道的任何错误......这样您就不必预先计划好所有错误。这个框架的好处是你可以让它在发生错误时向你发送一封电子邮件,并将其记录到xml文件中(以及其他配置可能性)。非常便利!
希望我能解决您的所有问题!
答案 1 :(得分:2)
“从不”捕获System.Exception。你可能隐藏了一个问题。最好“快速失败。”
仅捕获以下异常:
因此,为了回答您的最后一组问题,如果您可以检查代码中的条件,我不会捕获这些异常。例如,如果FileNotFound是其中之一,而不是陷阱FileNotFoundException,请检查文件。如果NullReference为1,请检查对象是否为null而不是捕获异常。
安德鲁建议使用ELMAH来记录未处理的异常,或者任何例外,这是一个很好的例子,IMO。