捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?

Posted

技术标签:

【中文标题】捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?【英文标题】:Clean way to catch all errors thrown in an MVC 3.0 application? 【发布时间】:2012-02-01 11:22:38 【问题描述】:

我正在构建一个 MVC 3.0 电子商务网站。我想避免在我的代码中粘贴 try-catch 块。

问题很简单 - 什么是捕获我网站上抛出的所有错误的好策略?我想了解所有这些……所以一旦网站上线,我就可以努力将这个计数变为 0。我计划将每个错误写入记录器并通过电子邮件发送。

我已经阅读了一些关于在 global.asax 文件中捕获它的信息......但我也读到它没有得到所有这些。

有人有什么建议或者可以指点我一个好的方向吗?

【问题讨论】:

我喜欢所有的答案...我试过关于 ELMAH 的答案,我很喜欢。安装它很容易,我要用我蹩脚的记录器完全替换它。我希望看到一些投票/cmets 以确保 ELMAH 是要走的路... 我同意! ELMAH 很棒,而且很容易设置。我已经在多个项目中成功使用了 ELMAH。 【参考方案1】:

解决该问题的 MVC 方法是 过滤器。如果您已经在 MVC3 上,则全局过滤器适合您。有一种特殊类型的过滤器用于处理错误:HandleError 过滤器。 This article 描述了很多使用它。

您可以实现自己的过滤器并控制未处理异常的各个方面,例如:

public class HandleExceptionsAttribute : HandleErrorAttribute

    public override void OnException(ExceptionContext filterContext)
    
        var expception = filterContext.Exception;

        // custom code here..
    

最后,如果您想存储和记录所有未处理的异常,ELMAH 即 ELMAH.MVC 是最佳选择。使用NuGet package安装它,配置它,所有数据都将通过如下链接访问:

http://yourapp/admin/elmah/

我的建议是不要在 Global.asax.cs 中使用 Application_Error 之类的东西。

【讨论】:

我走了这条路。使用 nuget 几乎为我设置了一切,这很棒。唯一的陷阱 - 人们需要确保他们保护他们的 elmah.axd 文件。即使您将授权 attr 放在 elmah 控制器上,您仍然可以访问 elmah.axd。如果您阻止它,请确保您也无法执行 /a/b/c/d/elmah.axd... 之类的操作,因此需要做一些工作。 不要打扰 elmah.axd,甚至请从您的 web.config 中删除它!不幸的是,我不能自动做到这一点。安装 Elmah.MVC 后,您将注册 app/admin/elmah 路由。通过 [Authorize] 属性保护它没问题; 这里有一些细节:beletsky.net/2011/03/integrating-elmah-to-aspnet-mvc-in.html 嘿亚历山大,你是对的。我在我的 web.config 中注释掉了与 elmah.axd 有任何关系的 httphandlers 和 handlers 部分......结果我们不需要它。放入 Area/Admin/Elmah 的控制器似乎可以在没有 elmah.axd 的情况下完成所有操作。我不知道为什么 nuget elmah.axd 只是不把那些东西放在那里(或者更确切地说,应该把它放在注释掉的开头......) 嘿,亚历山大,还有一条评论。您的博客条目包含所有需要的信息,但顶部的红色评论具有误导性:“更新:Elmah.MVC 现在作为 NuGet 包发布。无需阅读那么长的博客文章,只需安装它。”。我以为您的说明是针对手动安装的人...但是您确实有有关处理程序/ httphandlers的这些额外信息,这实际上是阅读“长博文”的好理由=)【参考方案2】:

您可以在 Global.asax 中处理任何抛出的异常。

protected void Application_Error(object sender, EventArgs e) 

  Exception exception = Server.GetLastError();
  // global handling code goes here

  Server.ClearError();

【讨论】:

这似乎容易受到竞争条件的影响。

以上是关于捕获 MVC 3.0 应用程序中抛出的所有错误的干净方法?的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:未捕获的 CurlException:7:无法连接到第 887 行 ....src/base_facebook.php 中抛出的主机

如何捕获ctypes中抛出的异常?

捕获 AuthenticationProvider 中抛出的异常

捕获在不同线程中抛出的异常

Spring中如何管理过滤器中抛出的异常?

是否可以捕获 JavaScript 异步回调中抛出的异常?