3

如何以类的形式传递错误。创建示例类时。

班级:

class ThreadSafeLog
{
  public ThreadSafeLog()
  {
    try
    {
      if (!File.Exists(Path_))
      {
        using (File.Create(Path_)) { }
      }
    }
    catch(Exception e)
    {
      MessageBox.Show(e.Message);//error transmit exception to Form
    }
  }
}

形式:

ThreadSafeLog log = new ThreadSafeLog(
  @"R:\project\ThreadSafeLog\ThreadSafeLogTest\ThreadSafeLogTest\bin\");
4

2 回答 2

2

为什么ThreadSafeLog要关心使用它的表单在做什么?它甚至应该如何知道它正在被表单使用?而是在表单中捕获异常。

class ThreadSafeLog
{
    public ThreadSafeLog()
    {
        if (!File.Exists(Path_))
        {
            using (File.Create(Path_)) { }
        }
    }
}

形式:

try
{
    ThreadSafeLog log = new ThreadSafeLog(
        @"R:\project\ThreadSafeLog\ThreadSafeLogTest\ThreadSafeLogTest\bin\");
}
catch (Exception ex)
{
    MessageBox.Show(e.Message);
}

不过,正如 Adriano 指出的那样,您可能还想质疑为什么要直接向用户显示内部错误详细信息。

于 2013-08-30T11:53:14.493 回答
0

我不会通知日志的用户有关记录器本身内部的错误。日志通常是一个子系统,最好考虑错误安全和线程安全,否则你会让你的代码变得混乱。想象:

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;
    }
}
于 2013-08-30T12:03:58.947 回答