我的基本控制器中有一个覆盖OnException(ExceptionContext filterContext),用于在任何错误期间捕获应用程序,然后记录它们。我在我的应用程序中遇到的问题是这种特殊方法因某些错误而被触发四次。我将引导您完成一个场景:
让我说我导航到: http://localhost:180/someController/someAction?someId=XX
我的代码中的对象处理很差。传入的Id是无效的,它会检索一些空对象,然后,我的坏对象处理的bc,尝试对空对象进行操作。我得到一个例外。
BaseController的OnException在此处被触发。
该null对象仍然返回到视图,视图尝试将其绑定到某个东西或者你拥有的东西。
对于视图中的错误,再次触发BaseController的OnException。
基本上,只有一个错误对我很重要,但涓流效应导致更多错误触发,并将我的收件箱垃圾邮件: - /。
在MVC2中捕获错误的正确方法是什么,而不是发生在我身上?
答案 0 :(得分:1)
我建议你继承HandleError属性并在那里滚动你的异常处理。在单个控制器上覆盖OnException意味着你要么在很多控制器中有很多异常处理代码,要么你从一个控制器继承,由于MVC管道在两种情况下都不是必需的。
通过使用该属性,每次执行操作时应该出现一次错误,一旦处理错误,它就不会再次触发。希望这会减少重复的异常消息。
我个人使用属性进行异常处理,因为它更干净,更可重复使用,并且在我的行动中摆脱了很多噪音。
答案 1 :(得分:0)
首先解释为什么会出现多个错误。第一个错误将来自尝试操作最有可能在您的模型或控制器中的空对象。当视图试图在期望对象存在时尝试绑定到空对象时,您可能会得到第二个异常。不完全确定为什么你得到4个错误,但可能是因为代码试图对当前为null的对象进行操作。
我的第一个建议是让您的OnException代码将应用程序重定向到友好的错误页面。您可能只是吃掉了每个新的异常而不是让web.config正确处理错误页面,如果你有这个设置来显示错误页面。
我的第二个建议是在操作之前添加一些代码来检查空对象。这些通常称为Guard子句,对实现非常有用且有用。然后,您可以确定一种友好的友好方式来处理错误,而不必总是记录异常,如果您不需要并且除了通用的“发生错误”之外还向用户显示友好消息。消息。
例如,在Controller中,您可以检查空对象,并在该对象为空时将备用视图传递给用户
Function Example As ActionResult
dim obj as Object = GetObject
If obj is Nothing Then
Return View("FriendlyNoObjectView")
Else
Return View(obj)
End If
End Function
我知道这是vb(对不起,我知道那比c#好),但想法是一样的。如果您希望仍然可以将其记录为错误,但您可以防止错误多次发生。在发生错误时处理错误总是很好的做法,并尽量不让它一直浮动到堆栈顶部并导致多个其他错误。
希望这有助于这些只是我阅读你的问题时的快速思考。