2

我已阅读有关 ASP.NET MVC 中的异常处理的文章。我想通过简要介绍它来确保我做对了。任何人都可以发表评论。

  1. 如有必要,在控制器操作中捕获异常。

    [HttpPost]
    public ActionResult Insert()
    {
        try
        {
    
        }
        catch
        {
            //ModelState.Error -> display error msg to the user.
        }
    }
    
  2. 覆盖 basecontroller 中控制器的“OnException”方法并“记录”步骤 1 中引发的异常和其他 MVC 异常

  3. 在 application_onerror 中记录全局异常。

4

3 回答 3

2

如果你想在你的动作中处理异常,你可以在你的控制器中覆盖“OnException”,如下所示:

protected override void OnException(ExceptionContext filterContext)
{
  logging or user notification code here
}

你可以把它放在你的 BaseController 类中以防止重复

于 2012-08-31T04:20:05.390 回答
2

我肯定会推荐 ELMaH,而不是自己编写此代码,也可以通过 Log4Net 为您的 MVC 应用程序编写代码。我个人避免任何异常处理,除非我对它有特定的功能响应。通过这种方式,我不会“吃掉”任何应用程序范围的工具(如 ELMaH)将为我优雅地处理的错误。

ELMaH 也有很好的内置网络报告,并且有专门用于 ELMaH 的第三方工具可以为您提供统计信息,例如最常见的错误。

您可以从自定义错误重定向开始...

<customErrors defaultRedirect="~/site/error" mode="RemoteOnly">
  <error statusCode="404" redirect="~/site/notfound" />
</customErrors>

...对于知道您正在使用 ELMaH 的控制器...

public virtual ActionResult Error() {
    System.Collections.IList errorList = new System.Collections.ArrayList();
    ErrorLog.GetDefault(System.Web.HttpContext.Current).GetErrors(0, 1, errorList);
    ErrorLogEntry entry = null;
    if (errorList.Count > 0) {
        entry = errorList[0] as Elmah.ErrorLogEntry;
    }
    return View(entry);
}

...由帮助访问者向您获取特定错误 ID 的视图提供支持:

@model Elmah.ErrorLogEntry

@if (Context.User.Identity.IsAuthenticated) {
    <p>Since you are signed in, we've noted your contact information,
    and may follow up regarding this to help improve our product.</p>
} else {
    <p>Since you aren't signed in, we won't contact you regarding this.</p> 
}
<p>Error ID: @Model.Id</p>

我还注意到在这个例子中这是一个 HttpPost。如果您正在使用 AJAX,那么您将希望以独特的方式处理错误。选择一个标准响应,您可以将其发送到所有 AJAX 代码都能正常处理的浏览器。也许通过在 javascript 警报中显示 ELMaH 错误 ID(作为一个简单的示例)。

我还通过 Global.asax 处理了一些特殊类型的 AJAX 错误:

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 &&
        Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")

HandleErrorAttribute 是一个不错的功能,但众所周知,将它与 ELMaH 结合使用需要额外的工作。如何让 ELMAH 与 ASP.NET MVC [HandleError] 属性一起使用?

于 2012-08-31T04:32:06.327 回答
0

try并且catch是针对预期的异常,即您的用户输入了一个文件名,但它可能不存在,因此您想要捕获FileNotFoundException.

对于意外异常,请使用 MvcApplication 对象中的错误事件,例如

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        this.Error += MvcApplication_Error;
        // Other code
    }

    private void MvcApplication_Error(object sender, EventArgs e)
    {
        Exception exception = this.Server.GetLastError();
        // Do logging here.
    }
}

或者正如 Dima 建议的那样,您可以使用控制器级别的执行处理

protected override void OnException(ExceptionContext filterContext)
{
   // Do logging here.
}

将尝试和捕获保留在您想要捕获预期并可以处理的代码上。“通用”错误处理只是混淆了潜在的问题,稍后您将不得不对其进行挖掘。

于 2012-09-05T14:08:00.010 回答