Регистрация пользовательского исключения C # - PullRequest
1 голос
/ 04 февраля 2011

Здравствуйте. Я хотел бы записать свое пользовательское исключение в файл журнала. Поэтому вместо того, чтобы выдавать свое исключение, я хотел бы записать это сообщение в текстовый файл.

Конструктор для моего исключения выглядит так:

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);                
}

Так что я спрашиваю. Как я могу записать свою строку «Не удалось найти путь:» в текстовый файл?

Ответы [ 5 ]

0 голосов
/ 04 февраля 2011

Из Framework Desing Guidelines:

Переопределять ToString, когда ваше исключение предоставляет дополнительные свойства.

Тогда вы можете просто вызвать log.Error(exception), и он будет просто зарегистрированкак ты написал ToString() без лишних действий.

0 голосов
/ 04 февраля 2011

Вам нужно найти способ вызвать ваше исключение, когда файл не найден.

Я не думаю, что это хорошая идея, потому что .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);
}

Не создавайте новый тип исключения, если он уже существует.

(Простите за отличительные черты в моем форматировании)

0 голосов
/ 04 февраля 2011

Вы можете использовать, вместо того, чтобы заново изобретать колесо, log4net http://logging.apache.org/log4net/ или NLog http://nlog -project.org / wiki / Documentation , которые стоят усилий, чтобы изучить и использовать даже в простом приложения.

0 голосов
/ 04 февраля 2011

Я бы обычно ловил и регистрировал пользовательское исключение за пределами обычного 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(" ");   
}

Вы создаете пользовательское исключение, поэтому можете обрабатывать его по-другому

0 голосов
/ 04 февраля 2011

Это выглядит немного излишне, почему бы вам не использовать Log4Net и не позволять ему писать файлы или отправлять вам электронные письма, в зависимости от его конфигурации в app.config?

В основном вы получаете все, что вы можете получитьбез всяких усилий, тогда вы можете сосредоточиться на том, что важнее всего.

, даже если вы решите сохранить свою текущую логику, я в любом случае создал бы класс Logger, который делает все вместо того, чтобы указывать DateTime.Теперь и другая магия в каждом блоке catch вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...