出于记录的目的,我想捕获一个异常。但是因为我还需要抛出异常,所以我会再次抛出异常。例如,我会在 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/