2013-07-03 3 views
1

У нас есть требование разбора/проверки большого количества строк, считанных из файлов CSV или Excel. Мы читаем строку и применяем бизнес-правила, чтобы проверить, содержат ли все ячейки/столбцы действительные данные.Правильный способ обработки ошибок и продолжения работы

Приложение должно продолжать проверять записи/столбцы до конца, даже если при ошибке или столбце возникает некоторая ошибка. В настоящее время мы будем так:

private void ValidateRow(RowObject obj) 
{ 
    try 
    { 
     foreach(var col in obj.Cells) 
     { 
      ValidateColumn(col); 
     } 
    } 
    catch(Exception ex) 
    { 
     //LOG ERROR 
    } 
} 

Столбцы Подтверждает так:

public void ValidateColumn(ColumnObject c) 
{ 
    try 
    { 
     //validate c 
    } 
    catch(Exception e) 
    { 
     //LOG Column Error 
    } 
} 

Мы регулируем ошибку в двух местах при проверке строк (ValidateRow), а затем для каждого столбца (ValidateColumn). Мой вопрос заключается в том, является ли это правильным или оптимальным способом обработки ошибок или что-то более оптимальное?

+0

Ошибки проверки не выглядят как * исключительные * условия. Скорее, кажется, что вы * ожидаете, что некоторые данные могут быть недействительными, поэтому у вас есть методы 'Validate'. Поэтому кажется, что использование исключений в первую очередь - плохой дизайн. –

+0

Вы действительно хотите обрабатывать все исключения? Как насчет 'OutOfMemoryException',' TypeLoadException' и 'AppDomainUnloadedException' например? –

+0

@CodyGray Цель состоит в том, что даже если любой вызов 'ValidateColumn' или' ValidateRow' не работает, программа должна продолжить следующую строку. Да, я сомневаюсь в этом дизайне, что является основной причиной, по которой я его раскрываю. – TheVillageIdiot

ответ

0

Поскольку мы не знаем вашу бизнес-логику, это трудно сказать. Но я бы рекомендовал оценить все возможные исключения и обработать их в разных блоках catch. Это позволяет вам более точно обрабатывать ошибки. Хороший совет - использовать Microsoft StyleCop и FxCop. Они помогут вам написать хороший код. В этом случае они скажут вам, чтобы вы не ловили общих исключений.

0

Я думаю, что ваш путь очень правильный и оптимальный. Если вы хотите продолжать идти, вы всегда должны попробовать/поймать внутри foreach. Но я думаю, вам не нужен внешний try/catch в этом случае, поскольку он будет работать только в том случае, если obj или obj.Cells имеет значение NULL. Если вы не разместили только часть своего кода. Хотя я согласен с комментариями, что валидация не должна генерировать исключение в первую очередь, но если вы используете какую-то 3d-библиотеку или какой-либо сложный код, на который вы не уверены, лучше справиться с этим так, как вы это делали.

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