记录用户定义的异常C#

时间:2011-02-04 10:44:59

标签: c# logging exception-handling custom-exceptions

您好我想将我的userdefined异常写入日志文件。 因此,我想将该消息记录到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文件中?

5 个答案:

答案 0 :(得分:0)

看起来有点过分,为什么不使用Log4Net并让它根据app.config中的配置写文件或发送电子邮件?

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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(" ");   
}

您正在创建用户定义的异常,以便您可以区别对待

答案 3 :(得分: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);
}

当一个已经存在时,不要创建新的异常类型。

(原谅格式化中的特质)

答案 4 :(得分:0)

来自框架设计指南:

  

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

然后你可以只调用log.Error(exception),它就会按照你ToString()编写的方式记录而不需要额外的操作。