2011-02-04 3 views
1

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

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

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-файл?

ответ

0

я обычно улавливать и регистрировать определенные пользователем исключения вне нормального TRY/улова

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

Thx djeeg, вот что я хотел сделать :) –

0

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

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

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

+0

Я не использую log4net, потому что хочу узнать, как это сделать. :) Вот почему я пытаюсь это написать. Я попытаюсь сделать класс журнала, но как мне записать строку из моего определяемого пользователем исключения? –

0

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

+0

См. Http://stackoverflow.com/questions/126540/what-is-your-net-logging-framework-of-choice – abatishchev

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

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

(простите за идиосинкразии в моем форматировании)

+0

Да, вы правы, это похоже тратить время на создание исключения, которое находится в .NET.Просто хотел попробовать, сделать исключение сам, и вот что, я мог бы придумать :) –

+0

@ Кеннет Андерсен: Достаточно справедливо. Я не понял, что это был эксперимент :) –

+0

Может быть хорошей идеей иметь пользовательские исключения из-за невозможности открыть различные файлы, если предполагаемый ход действий будет зависеть от того, какой файл не открывается. Например, предположим, что для открытия медиафайла требуется также загрузить CODEC. Было бы полезно или бесполезно, чтобы обе попытки открытия файла бросали FileNotFoundException при ошибке? Было бы более или менее полезно иметь один отчет MediaFileOpeningException и другое исключение CodecLoadingException? – supercat

0

С Руководством Framework Desing:

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

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

Смежные вопросы