c# - 捕获异常、记录并再次抛出异常是好习惯吗?

标签 c# exception-handling

出于记录的目的,我想捕获一个异常。但是因为我还需要抛出异常,所以我会再次抛出异常。例如,我会在 C# 中执行此操作,如下所示:

try
{
    //exception-prone code block here
}
catch(Exception ex)
{
   Logger.Log(ex);
   throw new Exception(ex);
}

现在我很好奇这是记录日志的最佳方式吗?请提出建议。

最佳答案

没有最好的记录方式。这始终取决于您的需求。

但如果您想减少代码并只记录错误,您可以创建自己的事件处理程序并将其附加到特定事件。

AppDomain.UnhandledException为例事件:

来自 MSDN 的演示代码:

public class Example 
{
   [SecurityPermission(SecurityAction.Demand, Flags=SecurityPermissionFlag.ControlAppDomain)]
   public static void Main()
   {
      AppDomain currentDomain = AppDomain.CurrentDomain;
      currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

      try {
         throw new Exception("1");
      } catch (Exception e) {
         Console.WriteLine("Catch clause caught : {0} \n", e.Message);
      }

          throw new Exception("2");
       }

       static void MyHandler(object sender, UnhandledExceptionEventArgs args) 
       {
          Exception e = (Exception) args.ExceptionObject;
          Console.WriteLine("MyHandler caught : " + e.Message);
          Console.WriteLine("Runtime terminating: {0}", args.IsTerminating);
       }
    }
}

您可以将您的登录信息放在 MyHandler 方法中并完成它。在不真正处理异常的情况下,您不需要滥用 catch block 。

在 Asp.Net 中,您可以覆盖 global.asax 中的 Application_Error 方法:

protected void Application_Error()
{
    Exception ex = Server.GetLastError();
    NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
    logger.Fatal(ex);
}

根据您的记录例程,现在可以做任何事情。在我的上述案例中,每个致命异常都会通过电子邮件发送到事件管理系统。

在我看来,关键点是,try/catch 应该处理异常。在 catch block 中记录错误就像在 catch block 中根本没有语句,您只是在吞下异常,而不处理它。最后它只是冗余代码。

关于c# - 捕获异常、记录并再次抛出异常是好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31782932/

相关文章:

.net - 如何阻止异常警报发狂

Ruby:捕获异常后继续循环

c# - 网络连接仅在设备通过电缆连接时有效

c# - 将 IEnumerable<Class> 转换为 List<string>

C# Post 请求被破坏

c# - 如何在 Visual Studio 2010 中将项目输出平台设置为 x86

c# - 在 C# 中抑制对未使用的异常变量的警告

c# - TabItem 在单击放置在其中的任何控件时触发 FocusGot 事件

ruby-on-rails - 在 Rails 中处理异常和错误的最佳策略是什么?

c# - 捕获大多数派生异常?