asp.net mvc 3中的错误处理

Sha*_*ean 34 error-handling asp.net-mvc ninject asp.net-mvc-3

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

这就是我想要做的:

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

我找到了以下方法:

  1. 我看到有一个很长的路要走做到这一点 在这里.(对于v1和v2,但也适用于v3).
  2. 在这里使用errorhandle属性.

我该如何正确处理?

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

Jer*_*ose 15

我建议实现一个自定义的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下是我用来处理这些无法处理的异常的jQuery:

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    showPopdown($.parseJSON(jqXHR.responseText).message);
});
Run Code Online (Sandbox Code Playgroud)

这允许我的Ajax方法非常轻量级 - 它们只处理返回正常的Json,并且在出现无法异常的情况下,带有错误状态代码的消息被包装在Json中并返回.

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


Sun*_*nil 14

对于全局错误处理
所有您需要做的就是更改web.config页面中的customErrors mode ="On"
错误将通过Error.cshtml显示在共享文件夹中.

确保Error.cshtml Layout不为null.
[它应该是这样的:@ {Layout ="〜/ Views/Shared/_Layout.cshtml"; }
或者删除布局=零码块]
的样品标记为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>
Run Code Online (Sandbox Code Playgroud)

对于特定错误处理
将HandleError属性添加到控制器类中的特定操作.为该特定错误提供"查看"和"异常类型".
示例NotImplemented Exception Handler:

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