在 ASP.Net 应用程序中实现通用错误处理的简单方法

Posted

技术标签:

【中文标题】在 ASP.Net 应用程序中实现通用错误处理的简单方法【英文标题】:Easy way to implement universal error handling in ASP.Net application 【发布时间】:2011-11-08 13:11:46 【问题描述】:

伙计们,

我有一个应用程序,它主要是一个包含大量用户控件和自定义控件的页面。正在使用 ASP.Net WebPart。网页及其母版页中几乎没有代码:它们都在各种组件中。

设计要求包括错误消息显示面板。客户希望应用程序在错误消息显示上显示应用程序任何部分中发生的任何错误,而不是转到自定义错误页面。 (这是最近的决定:当我们开始时,我们正在考虑自定义错误页面。)

据我所知,WebPart 不提供任何默认错误处理(不捕获错误和显示消息),并且当发生内部错误时,用户控件不一定会触发其 OnError 事件。

所以我正在考虑将所有内容都包含在 Try ... Catch 块中,至少在表示级别,并进行处理。所以我的问题是:是否有任何简单的方法来实现一种全局或至少类范围的错误处理程序,它将以我选择的方式处理错误,中断正在执行的例程,但返回(在处理后) 到失败的方法的调用者?

我愿意修改代码来验证子例程是否完成了他们应该做的事情并返回了适当的值(例如:非空数据对象。)我不希望整个过程被中止到最顶部,跳过渲染,或者(当然)著名的黄白屏幕。

我想这是面向方面编程的一个例子,但我认为 ASP.Net 还没有提供类似的东西。我也没有得到 EntLib 5.0 的印象。

如果可以用一个属性来装饰一个方法,该属性意味着“在错误调用某某类的某某静态方法”时,我会很喜欢它。但我对此表示怀疑。

欢迎提出任何建议。

谢谢,

安L.

【问题讨论】:

我有完全相同的问题要解决。你有没有找到解决方案?谢谢 @Chamila 我没有找到解决方案。但是,我认为现代 ASP.NET - 尤其是 MVC - 提供了比我在 2011 年更多的选择。不幸的是,我对它的调查还不够好,无法提出建议,所以我所能做的就是建议你看看最近的对 ASP.NET 的补充。祝你好运! 【参考方案1】:

对于初学者来说,将 Try Catch 处理程序放置在应用程序中的每段代码周围是一种不好的做法。每次设置时都会对性能造成轻微影响,这可能会很快减慢速度。

在您的 Global.asax.cs(或 .vb)文件中,有一个名为 Application_Error 的方法,它是全局错误处理程序。这将捕获您以前在应用程序中未捕获(或抛出)的任何错误。

您可以轻松地将错误处理代码放在这里。它可以像将错误消息转储到日志以供将来查看一样简单,或者检查异常类型(SQL vs. File vs. HTTP)并执行与类型相关的错误处理任务。

【讨论】:

非常感谢。不过,我关心的不是记录错误,而是在正确的阶段捕获它们,以便它们可以显示在屏幕上,而不会中断屏幕其他部分的生成或渲染。例如,新闻提要 WebPart 可能有问题,但 Daily Inventory 报告 WebPart 运行良好。我希望新闻提要能够向用户报告它在允许显示清单 WebPart 时出现错误。我希望我可以在没有战略性 Try 的情况下做到这一点...在表示层上捕获处理程序,但也许不是 @Ann L. 嗯,好点子。我想知道嵌套用户控件(称为 control_box 或其他东西)解决方案是否可行。您可以有一个用户控件来加载页面所需的所有用户控件。如果它们中的任何一个抛出错误,它们将被您的 control_box 捕获,然后可以将错误消息传送到适当的控制台。您甚至可以在其中使用一些 AJAX 类型的东西来帮助处理与页面相关的一些动态活动。【参考方案2】:

你需要看看 elmah。如果你用谷歌搜索“elmah”,它有一个错误模块/处理程序,它几乎可以满足你的需求(尽管它需要一些额外的调整..)

不过,您可能需要考虑让错误“冒泡”。编写一堆 Try..Catch..Finally 块存在一些严重的性能问题...

【讨论】:

Elmah 是事实上的解决方案。不幸的是,它只有大约 60% 足够好,真的没有其他选择。 我一直认为 log4net 是对 Elmah 的极大赞美。通过 Elmah 完成基本的错误处理,如果你真的需要做一些花哨或不同的事情,那么有一个 log4net 处理程序......

以上是关于在 ASP.Net 应用程序中实现通用错误处理的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 中实现配置文件提供程序

以干净的方式在 Asp.Net Core API 中实现 ProblemDetails 的最佳方法

在哪里可以找到在 ASP .NET MVC2 中实现密码恢复的 C# 示例代码

使用 Swagger 在 ASP.NET Core 中实现 OAuth

如何在现有数据库中实现 ASP.NET Identity 2.0?

在 ASP.NET MVC 中实现“记住我”功能