asp.net mvc 3 中的错误处理

Posted

技术标签:

【中文标题】asp.net mvc 3 中的错误处理【英文标题】:Error Handling in asp.net mvc 3 【发布时间】:2011-08-25 03:27:45 【问题描述】:

在 asp.net mvc 3 中是否有内置的或适当的方法来处理错误?

这就是我想做的:

    如果应用程序崩溃或抛出错误,它会转到特定的错误页面。 我可以从控制器操作中抛出我自己的错误。 (然后转到错误页面)。

我找到了以下方法:

    我知道还有很长的路要走 here。 (对于 v1 和 v2,但也 适用于 v3)。 使用错误句柄属性here。

我该如何正确处理这个问题?

如果解决方案类似或类似于上面列表中的#1,我正在使用 ninject 并且我没有创建基类。我该怎么做?

【问题讨论】:

【参考方案1】:

用于全局错误处理 您所要做的就是在 web.config 页面中更改 customErrors mode="On" 错误将通过 Error.cshtml 显示在共享文件夹中。 确保 Error.cshtml 布局不为空。 [它应该类似于:@ Layout = "~/Views/Shared/_Layout.cshtml"; 或删除 Layout=null 代码块] Error.cshtml 的示例标记:-

@ Layout = "~/Views/Shared/_Layout.cshtml";  

@model System.Web.Mvc.HandleErrorInfo

<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
    <p>Controller Name: @Model.ControllerName</p>
    <p>Action Name : @Model.ActionName</p>
    <p>Message: @Model.Exception.Message</p>
</body>
</html>

针对特定的错误处理 将 HandleError 属性添加到控制器类中的特定操作。为该特定错误提供“视图”和“异常类型”。 NotImplemented 异常处理程序示例:

public class MyController: Controller
    
        [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
        public ActionResult Index()
        
            throw new NotImplementedException("This method is not implemented.");
            return View();
        

【讨论】:

【参考方案2】:

我建议实现一个自定义 HandleErrorAttribute 操作过滤器。

查看此链接了解更多详情:http://msdn.microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

设置一个 HandleErrorAttribute 动作过滤器可以让您完全控制过滤器处理哪些动作,并且很容易在控制器级别进行设置,甚至可以通过在自定义基础控制器上设置站点级别进行设置,并拥有您的所有控制器都继承自基本控制器。

我对此做的其他事情是,我有一个单独的 HandleJsonErrorAttribute,它通过返回 Json 响应而不是自定义页面来响应 Ajax 调用。

更新:

根据以下一些问题,这是我使用的HandleJsonErrorAttribute 示例:

public class HandleJsonErrorAttribute : HandleErrorAttribute

    public override void OnException(ExceptionContext filterContext)
    
        var serviceException = filterContext.Exception as ServiceException;

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        filterContext.Result = new JsonResult  Data = new  message = serviceException == null ? "There was a problem with that request." : serviceException.Message  ;

        filterContext.ExceptionHandled = true;
    

这是我用来处理这些未经处理的异常的 jQuery:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) 
    showPopdown($.parseJSON(jqXHR.responseText).message);
);

这让我的 Ajax 方法变得非常轻量——它们只处理返回正常的 Json,并且在发生未处理的异常时,带有错误状态代码的消息会被包装在 Json 中并返回。

另外,在我的实现中,我有一个从服务中抛出的自定义 ServiceException,它从服务层发送消息而不是通用消息。

【讨论】:

您能否举例说明我将如何使用HandleJsonErrorAttribute 处理这些ajax 错误调用? 是的,我也对 HandleJsonErrorAttribute 感兴趣。你能给我更多的信息和/或一个例子吗? 不错的代码!这个对我有用。谢谢!我只将 StatusCode 更改为“Ok”并在我自己的代码中处理异常。对于正在搜索如何使用的每个人:只需将属性放在 Action 中(例如:[HandleJsonErrorAttribute]public JsonResult ActionNameX(object someArgs) ... 【参考方案3】:

我认为最简单的方法是使用 elmah 库。

看看这个:http://code.google.com/p/elmah/wiki/MVC 和这个 http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx

【讨论】:

【参考方案4】:

我认为最简单的方法是使用 ExceptionHandler 属性,因为它随时可以在您创建新的 ASP.NET MVC 3 项目时使用。您仍然可以像往常一样将 Web.config 配置为使用自定义错误页面并在全局 Application_Error 方法中处理异常,但是当发生异常时,URL 不会像新的 MVC 3 那样显示得那么好。

【讨论】:

确切的属性名称是HandleError。【参考方案5】:

如果您想自定义一种异常处理方式,您可以在 MVC 中创建自定义异常。 你可以在这里找到有用的帖子。 http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html

【讨论】:

请发布主题内容,而不是链接。

以上是关于asp.net mvc 3 中的错误处理的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net MVC (RC 5) 中的 404 Http 错误处理程序

ASP.NET MVC 处理错误

ASP.NET MVC 错误处理 - 删除 aspxerrorpath

ASP.NET MVC 404 错误处理 [重复]

与 ASP.net MVC 中 Ajax 请求中的错误处理有关的疑问

asp.net mvc全局错误处理