我不会通知日志的用户有关记录器本身内部的错误。日志通常是一个子系统,最好考虑错误安全和线程安全,否则你会让你的代码变得混乱。想象:
try
{
// Do something that may fail
}
catch (SomeException e)
{
try
{
logger.Log(e);
}
catch (IOException)
{
// Ooops, log doesn't work. What should I do?
// Should I display a MessageBox?
}
}
您的代码很快就会变得一团糟(想象一下对每个跟踪日志一次又一次地重复相同的检查)。
我要做的是忽略(如果可能的话)日志函数中的错误并采取另一个行动。如何?只需将一个事件添加到您的日志类(代码是一个不用于生产的示例!):
class Logger
{
public event EventHandler<LogErrorEventArgs> Error;
public void Log(Exception e)
{
try
{
// Try to write log somewhere...
}
catch (IOException internalException)
{
EventHandler<LogErrorEventArgs> error = Error;
if (error != null)
error(this, new LogErrorEventArgs(e, internalException);
}
}
}
这样,记录器中未处理的错误将不会被注意到(如果适用),或者它们可能会被处理(以适当的方式,如果有办法的话)。例如:
Logger logger = new Logger();
logger.Error += delegate(object sender, LogErrorEventArgs e)
{
if (SystemInformation.UserInteractive)
MessageBox.Show(e.ExceptionToLog.Message);
};
您也可以附加多个处理程序(例如登录到 Windows 日志并通知用户会话是交互式的)。当您使用 log 时,您不会意识到它可能会失败(因此您不必在任何地方都用try
/填充代码catch
),但如果需要,您仍可能会收到通知,并且 log 中的错误将以一致的方式处理。
现在让我们重写第一个示例中的代码,如下所示:
try
{
// Do something that may fail
}
catch (SomeException e)
{
logger.Log(e);
}
直的,对吧?我假设记录器总是会写一个异常(以某种方式),但是很容易更改代码来处理原始代码String
。我省略了代码,LogErrorEventArgs
因为很明显它可能看起来像这样:
class LogErrorEventArgs : EventArgs
{
public LogErrorEventArgs(
Exception exceptionToLog,
Exception internalLoggerException)
{
ExceptionToLog = exceptionToLog;
InternalLoggerException = internalLoggerException;
}
public Exception ExceptionToLog
{
get;
set;
}
public Exception InternalLoggerException
{
get;
set;
}
}