如何以类的形式传递错误。在创建示例类时。
类别:
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\");
答案 0 :(得分: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指出的那样,您可能还想质疑为什么要直接向用户显示内部错误详细信息。
答案 1 :(得分:0)
我不会通知日志用户有关记录器本身内部的错误。 Log通常是一个子系统,它可以考虑错误安全和线程安全,或者您将代码设置为凌乱。想象:
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日志并通知用户会话是交互式的)。当您使用日志时,您将不会意识到它可能会失败(因此您无需在任何地方使用try
/ catch
填写代码)但如果需要,您可能仍会收到通知并且日志中存在错误将以一致的方式处理。
现在让我们在第一个例子中重写代码:
try
{
// Do something that may fail
}
catch (SomeException e)
{
logger.Log(e);
}
直,对吗?我假设logger总是写一个异常(不知何故),但很容易改变代码来处理原始的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;
}
}