我不会通知日志记录器本身内部的错误给日志的使用者。通常,日志是一个子系统,它应该被认为是安全的,并且线程安全,否则你的代码将变得 混乱。想象一下:
try
{
}
catch (SomeException e)
{
try
{
logger.Log(e);
}
catch (IOException)
{
}
}
你的代码很快就会变得混乱(想象一下为每个跟踪日志重复执行相同的检查)。
我会做的是在日志函数内忽略(如果可能的话)错误并采取其他措施。如何实现?只需向日志类添加一个事件(以下代码仅供示例,不用于生产!):
class Logger
{
public event EventHandler<LogErrorEventArgs> Error;
public void Log(Exception e)
{
try
{
}
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日志并通知用户会话是否交互)。当你使用日志时,你不会意识到它可能会失败(因此你不必在代码中到处填写try
/catch
),但如果需要,你仍然可以被通知,并且日志内部的错误将以一致的方式处理。
现在让我们像这样重写我们第一个示例中的代码:
try
{
}
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;
}
}