C# 处理异常的一般方法

C# 处理异常的一般方法,c#,asp.net,exception,C#,Asp.net,Exception,我试图在我的web应用程序中设计异常处理机制,但在设计过程中遇到了一些困难 据我所知,有三种方法可以捕获ASP.NET应用程序中的异常- 在代码本身中(try,catch,finally) 在页面的页面\u错误事件中 在global.asax页面的Application\u Error事件中 因为我的.aspx页面中有许多事件和函数,所以我想要一个地方来捕获和收集异常。 换句话说,我真的不想在代码中到处乱放try-catch语句,所以我想使用Page\u Error事件(在某些情况下,我读到这个

我试图在我的web应用程序中设计异常处理机制,但在设计过程中遇到了一些困难

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

  • 在代码本身中(
    try
    catch
    finally
  • 在页面的
    页面\u错误
    事件中
  • global.asax
    页面的
    Application\u Error
    事件中
  • 因为我的.aspx页面中有许多事件和函数,所以我想要一个地方来捕获和收集异常。 换句话说,我真的不想在代码中到处乱放try-catch语句,所以我想使用
    Page\u Error
    事件(在某些情况下,我读到这个事件可能是一个很好的实践)

    但是,出现了一个问题,因为我只希望异常处理程序在页面上显示一个良好的警报,通知发生的一般问题,但正如您可能知道的那样-当您进入
    page\u Error
    时,页面已经死了,无法呈现

    那么,还有什么其他通用的方法来捕获异常呢?在将来编写函数时,我不需要考虑异常或尝试捕获,而是知道在某个地方有一种机制可以捕获并处理所有异常?

    使用Elmah-


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

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

    protected void Application_Error(Object sender, EventArgs e)
    {
      Response.Write("Really sorry this happened")
    }
    
    此方法将确保以这种方式捕获和处理所有(未处理的)异常,因此您也可能希望在这里实现某种类型的日志系统


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

    我认为根本不尝试/捕获异常可能会限制您获得一些好处/技术,例如。无论如何如果合适,您可以允许在web.config上显示自定义错误页面

    我个人会使用Application_Error来记录异常,但从这个意义上讲,最好尝试一下@MoXplod建议


    顺便说一句,我可能不完全正确,但在发生错误时将stacktrace写入页面可能包含安全问题。

    我使用Application\u error记录错误,然后执行服务器操作。传输到自定义错误页面。通过这种方式,我可以获取该页面上的异常并决定如何显示它。但我担心,如果您想在警报中显示异常,可能是出于错误的目的使用了异常。您不会因为验证错误或其他可以预料的事情而抛出异常,是吗?

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

    以这段代码为例:

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

    提醒用户出现问题是更好的做法,还是制定一个后备计划(例如,仅将0分配给newValue)更好?你的答案可能会因情况而改变;然而,如果你用一种通用的方式处理这个问题,你会人为地限制自己。

    在我的例子中,我最终使用了Post Sharp,一种AOP框架。当发生异常时,我使用它输入一些策略

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

    这样或那样,在“抽象”(也就是说)级别捕获异常而不使用try-catch填充代码的解决方案可能会包含这么多AOP


    goodluck

    如果发生异常,该页面可能根本不存在。(取决于引发异常的位置)您所能做的就是显示一个单独的错误页面。他希望在页面中显示错误消息。艾玛不会那么做的。这是真的,但我正在寻找一种方法。。。用try-catch语句覆盖了所有的类代码,所以我不需要为其中的每个函数编写它们。有类似的吗?