Поток программы через пользовательское исключение - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть процесс, который анализирует файл XML.

Это происходит в классе PAckage.

В классе Package есть Делегат, который устанавливает недопустимое состояние объекта и фиксирует подробную информацию об ошибке, произошедшей в классе Package

Для простоты я показываю filitem, передаваемый в пакет ..

Т.е. `

foreach( var package in Packages)
{
try
{

    package.ProcessXml(fileitem.nextfile);

}
catch (CustomeErrorException ex)
{
    Logger.LogError(ex)
}
}

Внутри пакета мои проверки выглядят примерно так

var Album = xml.Descendants()
    .Select(albumShards => new Album {
      Label = (string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() == "" ?
FailPackage("Error on label Load",Componets.Package,SubComp.BuildAlbum ) :  (string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault()

В этой проверке я проверяю, возвращено ли "" для метки ... если так, то вызовите Failpackage с информацией об ошибке и создайте исключение

 protected override void FailPackage(string msg, LogItem logItem)
         {
             Valid = ProcessState.Bad;
             Logger.LogError(msg,logItem);
             throw CustomErrorException(msg, Logitem);

         }

, который захватывается с помощью блока try catch

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

Ответы [ 2 ]

2 голосов
/ 19 декабря 2011

ProcessXml не может выполнить то, что подразумевается под его именем в определенных случаях;это случаи ошибок.Исключения предназначены для обработки ошибок, несмотря на то, что следует из названия.

Одно из самых больших заблуждений об исключениях заключается в том, что они предназначены для «исключительных условий». Реальность такова, что они предназначены для сообщения об ошибках.

Кшиштоф Квалина, Руководство по разработке структуры : условные обозначения, идиомы и шаблоны для многократно используемых библиотек .NET

Другими словами, вы 'в праве.:)

Прочтите главу об исключениях в вышеприведенной книге, чтобы найти отличные рекомендации.

0 голосов
/ 24 декабря 2011

Вы можете поместить ошибку вместе с ProcessState:

foreach( var package in Packages)
{
    package.ProcessXml(fileitem.nextfile);
    if(!package.Valid)
        Logger.LogError(package.Error)
}



var albumShards = xml.Descendants().FirstOrDefault();
if((string)albumShards.Descendants(TempAlbum.LabelLoc).FirstOrDefault() == "")
    return FailPackage("Error on label Load",Componets.Package,SubComp.BuildAlbum );

album = (string)albumShards.Descendants(TempAlbum.LabelLoc);


 protected override void FailPackage(string msg, LogItem logItem)
 {
     Valid = ProcessState.Bad;
     Logger.LogError(msg,logItem);
     Error = msg;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...