ASP.NET异常处理/日志记录

6

有没有一种简单的方法来记录ASP.NET应用程序中的所有异常?我已经通过Application_OnError事件记录了未处理的异常,但我希望即使在页面级别处理异常时也进行日志记录。

非常感谢。


你是说通过捕获它来处理,还是使用Page_Error或其他方法?请具体说明。 - RichardOD
7个回答

9
你可以使用 Elmah 来记录你的异常。它非常容易使用,而且提供有关问题的良好信息。

您可以在不更改任何代码的情况下获得以下功能:* 记录几乎所有未处理的异常。 - staterium
1
推荐Elmah可以得到+20分。在我看来,它已经成为开发的标准。如果我没记错,SO也在使用它。 - Diago

5
假设您只抛出和捕获自己的异常类型(当然是派生自System.Exception),则可以在其构造函数中使基本异常记录所需的任何内容。

2
这种情况不太可能发生,因为标准的 .Net 组件会抛出许多异常——将它们重新抛出作为你自己的异常会非常浪费。 - cjk
嗯,有趣的角度。我将不得不提供自己的基本异常类型,然后单独修改每个catch语句,但至少所有我的日志记录功能都在一个地方。 - staterium
@ck - 你的意思是由服务器控件引发的异常,例如下拉列表被设置为无效的selectedindex吗? - staterium
将此视为最可接受的解决方案,因为其他唯一的选择是“无法完成”。谢谢Meeh。 - staterium
2
在实际应用中,你不能只捕获自己的异常类型。你可以在上层(如UI)中捕获它们。这将要求你在较低层次上用自己的异常类型包装每个捕获的异常并重新抛出它们。然而,这仍然不能涵盖所有情况。 - Piotr Owsiak

3

我同意Collin的看法,你应该在捕获异常时记录日志(不要重新抛出异常)。

但是如果你需要在不进行太多代码修改的情况下记录每个异常,那么可以处理AppDomain.FirstChanceException事件,这样你就可以得到所有的异常(也许有些过多了:p,但它可以帮助你清理代码)。


1
在处理异常的 catch 块中调用您的日志记录组件。

嗯,是的。但我在想是否有更简单的方法来做到这一点?而不需要逐个修改每个catch语句? - staterium
如果你不处理错误,为什么要有catch语句呢? 如果你处理了错误,那么就没有必要在日志中记录它了! - Richard L
2
我确实会为了用户的利益处理错误,但是为了调试目的,我需要比显示给用户的更多信息。 - staterium

1

ASP.NET 健康监控以一种优雅而相当自动的方式实现了这一点(无需手动捕获异常):

当你点击第一个链接时,会出现一个如何启用和配置 ASP.NET 健康监控的示例。您需要在 web.config 文件中进行配置。

要记录到数据库,您可以使用 ASP.NET SQL Server 注册工具创建相应的表格:ASP.NET SQL Server 注册工具 (Aspnet_regsql.exe)

我真的很喜欢它。对于手动日志记录,模式和实践企业库的日志应用块可能适合您,但这略有些偏题。

Matthias


0

2
虽然这可能在理论上回答了问题,但最好还是在这里包括答案的关键部分,并提供参考链接。 - GDP

0

我认为没有任何自动记录已处理异常的方法。如果您已经为未处理的异常执行了Application_OnError日志记录,那么恐怕Colin是正确的,您将不得不在捕获块中调用日志记录组件以记录您想要记录的已处理异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接