处理异常的一般方法

时间:2011-11-17 19:09:46

标签: c# asp.net exception

我正在尝试在我的网络应用中设计异常处理机制,并在设计中遇到一些困难。

据我所知 - 在ASP.NET应用程序中有三种方法可以捕获异常 -

  1. 代码本身(trycatchfinally
  2. 在页面的Page_Error事件中
  3. Application_Error
  4. global.asax事件中

    由于我的.aspx页面中有很多事件和函数,我想要一个可以捕获和收集异常的地方。 换句话说 - 我真的不想在整个代码中使用spreaindg try-catch语句,所以我想使用Page_Error事件(在某些情况下我读到的可能是好的做法)。

    然而,出现了一个问题,因为我想让异常处理程序做的就是在页面本身上显示一个很好的警报,告知发生的一般问题,但是你可能知道 - 当你到达Page_Error时页面已经死了,无法呈现。

    那么,还有什么其他通用的方法可以捕获异常,这种方式在将来我将编写函数时我不需要考虑异常或try-catch,而是知道某处有一种机制在那里会抓住一切并处理它?<​​/ p>

6 个答案:

答案 0 :(得分:1)

使用Elmah - http://code.google.com/p/elmah/

这将捕获并记录任何未处理的错误,而无需编写一行代码:)

答案 1 :(得分:0)

由于发生异常,这意味着页面无法呈现(无论出于何种原因)。这将导致异常传播调用堆栈,直到它被处理到某处。您可以在ASP.NET中处理异常的最后一个位置是global.asax,并且由于存在问题,您可以创建要写入客户端的任何输出:

protected void Application_Error(Object sender, EventArgs e)
{
  Response.Write("Really sorry this happened")
}

此方法将确保以这种方式捕获和处理所有(未处理的)异常,因此您也可能希望在此处实现某种日志系统。

当然,您也可以在web.config中指定自定义错误页面。

答案 2 :(得分:0)

我认为,不尝试/捕获异常可能会限制您使用某些好处/技术,例如Repeating a function in C# until it no longer throws an exception。无论如何你可以允许在web.config上显示自定义错误页面如果它适合。

我个人会使用Application_Error来记录异常,但从这个意义上说,更好的方法是尝试@MoXplod建议。

顺便说一句,我可能不完全正确,但是当发生错误时将堆栈跟踪写入页面可能包含安全问题。

答案 3 :(得分:0)

我使用Application_Error记录错误,然后执行Server.Transfer到自定义错误页面。通过这种方式,我可以在该页面上获取异常并决定如何显示它。我担心,如果您想在警报中显示异常,可能是因为错误的目的而使用异常。你没有抛出验证错误的例外或其他可以预见的事情,是吗?

答案 4 :(得分:0)

正确处理异常的唯一真正方法是尽可能接近违规代码。通过这种方式,您可以更好地控制如何最好地处理它。换句话说,让那些try-catch语句“遍布整个代码”。

以这段代码为例:

Int32 value = 0; // let's say this was passed in.
double newValue = 5 / value;

是否更好地提醒用户发生问题或者更好地制定回退计划,例如,仅将0分配给newValue?你的答案可能会根据情况而改变;但是,如果你以一般方式处理这个问题,那么你会人为地限制自己。

答案 5 :(得分:0)

在我的情况下,我最终使用了AOP框架Post Sharp。当发生异常时,我用它来输入一些政策。

另一个选项是Enterprise Library的策略注入,它允许在特定情况下插入代码,例如 - 属性包围的方法或类,以及附加到它的异常处理模块。

这种或那种方式,用“抽象”(可以这么说)级别捕获异常而不用try-catch填充代码的解决方案将会包含这个AOP数量。

古德勒克