【问题标题】:Catching handled exceptions捕获处理的异常
【发布时间】:2010-11-24 07:10:47
【问题描述】:

嘿:)
有没有办法在全局范围内捕获 handled 异常?我知道我们可以使用“AppDomain.CurrentDomain.UnhandledException”和“Application.ThreadException”捕获未处理的异常,但我想为我已经捕获的异常添加一些处理(例如写入日志等)

谢谢

【问题讨论】:

    标签: c# exception exception-handling


    【解决方案1】:

    通常,您可能希望在代码中尽可能低的级别捕获异常。与异常发生的位置越接近,您就越有可能解决导致它们的问题。

    如果您无法在此级别采取任何纠正措施以解决导致异常的问题,那么您根本不应该处理它 em>. 让异常冒泡,然后在全球范围内随心所欲地处理它。

    话虽如此,如果您在较低级别处理异常,您能够在较高级别捕获它的唯一方法是,如果您rethrow it 来自较低级别的 Catch 块。
    因此,例如:

    try
    {
       //your code
    }
    catch (SomeException e)
    {
       //take any relevant handling measures
    
       //rethrow the exception
       throw; 
    }
    

    当然,这在技术上意味着该异常在较低级别的 Try/Catch 块中未处理,但这是在较高级别捕获任何东西的唯一方法级别。

    有关重新抛出异常的更多信息,请参阅:

    【讨论】:

      【解决方案2】:

      您可以重新抛出相同的异常并在调用模块/日志模块中捕获它,然后记录它。 例如:

      private void DivideByZero()
      {
      try
      {
          int x = 2/0;
      }
      cath(Exception ex)
      {
          Console.Writeline(ex.ToString());
          throw;
      }
      }
      
      void Main(string[] a)
      {
          try
          {
             DivideByZero();
          }
          catch(Exception x)
          {
              // write logging code here .. 
          }
      
      }
      

      【讨论】:

      • 重新抛出意味着异常没有处理。
      • @Brian,他想知道如何捕捉“已处理”异常,所以我向他展示了一种可能的方法。可能还有其他方法。
      • 不,他说他想监控日志记录等异常,而不是让他的应用程序崩溃作为副作用。
      • @Albin,他的第一行是“有没有办法在全局范围内捕获已处理的异常?”
      【解决方案3】:

      不,没有全局异常事件。那将是非常危险的,您会从其他模块中捕获各种不供公众使用的内部异常。它还可能会在异常情况下淹没您的日志。

      您应该更加结构化地处理异常以达到相同的效果。封装异常的实际处理,在实际的 catch 块中做最少的工作。通过在某个地方使用“HandleException”方法,您也可以传递每个异常。您还可以查看 Enterprise 库中的 Exception Handling block

      【讨论】:

      • 我了解到企业库中的异常处理块可以提供某种委托,该委托在每个“catch”块中被调用。对吗?
      猜你喜欢
      • 2010-12-11
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2018-02-06
      相关资源
      最近更新 更多