1

您好,我想将用户定义的异常写入日志文件。因此,我不想抛出我的异常,而是想将该消息记录到一个 txt 文件中。

我的异常的构造函数如下所示:

public OpenFileException(string pathToOpen, Exception innerexception)
    : base("Couldn't find the path: " + pathToOpen, innerexception)
{
    this.pathToOpen = pathToOpen;
}

这就是我目前记录异常的方式:

try
{
    string data = Read(txtLocation.Text);
    txtInfo.Text = data;

}
catch (Exception ex)
{

    WriteLog("[" + DateTime.Now + "]" + " " + ex.Message);
    MessageBox.Show(" ");       
    throw new OpenFileException(txtLocation.Text, ex);                
}

所以我要问的是。如何将我的字符串“找不到路径:”记录到 txt 文件中?

4

5 回答 5

0

看起来有点矫枉过正,你为什么不使用 Log4Net,让它根据 app.config 中的配置写文件或给你发邮件呢?

基本上,您可以毫不费力地开箱即用地获得所有想要的东西,然后您就可以专注于最重要的事情。

即使您决定保留当前的逻辑,我还是会创建一个 Logger 类来完成所有操作,而不必在应用程序的每个 catch 块中指定 DateTime.Now 和其他魔法。

于 2011-02-04T10:49:10.183 回答
0

您可以使用 log4net http://logging.apache.org/log4net/或 NLog http://nlog-project.org/wiki/Documentation而不是重新发明轮子,即使在简单的应用程序中也值得努力学习和使用.

于 2011-02-04T10:49:53.453 回答
0

我通常会在正常的 try/catch 之外捕获并记录用户定义的异常

try {
    try {
        string data = Read(txtLocation.Text);
        txtInfo.Text = data;
    } catch (Exception ex) {
        throw new OpenFileException(txtLocation.Text, ex);
    }

        ....

} catch(OpenFileException ex) { 
    WriteLog("[" + DateTime.Now + "]" + " " + ex.Message);
    MessageBox.Show(" ");   
} catch(Exception ex) { 
    WriteLog("[" + DateTime.Now + "]" + " " + ex.Message);
    MessageBox.Show(" ");   
}

您正在创建用户定义的异常,因此您可以以不同的方式处理它

于 2011-02-04T10:52:40.893 回答
0

当找不到文件时,您需要找到一种方法来引发异常。

我认为这不是一个好主意,因为.NET 已经在FileNotFoundException找不到文件时抛出了。您应该抓住它并以这种方式记录消息。

try
{
    string data = Read(txtLocation.Text);
    txtInfo.Text = data;

}
catch (FileNotFoundException ex)
{
    string log = String.Format("[{0}] Couldn't find the path: {1}"
                              , DateTime.Now
                              , ex.FileName);
    WriteLog(log);
}

不要在已经存在的情况下创建新的异常类型。

(请原谅我的格式中的特质)

于 2011-02-04T10:54:22.427 回答
0

从框架设计指南:

当您的异常提供额外属性时,请覆盖 ToString。

然后你可以打电话log.Error(exception),它会按照你写的方式被记录下来,ToString()而不需要额外的操作。

于 2011-02-04T11:00:37.257 回答