как использовать исключения в этом сценарии? - PullRequest
3 голосов
/ 13 апреля 2010

У меня есть метод, который обрабатывает набор записей. Этот метод возвращает true \ false после обработки. Так что, если все записи обработаны (выполняется некоторое обновление базы данных), вернет true. Теперь, предположим, после обработки 1 записи , выдается какое-то исключение, я должен написать result = false (в конце метода возвращается результат) в блоке catch? И разрешить обработку других записей?

Ответы [ 3 ]

1 голос
/ 13 апреля 2010

Продолжать добавлять данные в базу данных при неудачном добавлении одной записи почти всегда неправильно. Записи очень часто связаны между собой. Они представляют собой набор транзакций на банковском счете. Или пакет заказов от клиента. Добавление их при отсутствии одного из них всегда является проблемой.

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

При возникновении ошибки отклонить весь пакет. Поддерживайте базу данных в правильном состоянии, используя транзакции. Используйте, скажем, SqlTransaction и вызовите BeginTransaction () при запуске. Вызовите Commit (), когда все работает, вызовите Rollback () в предложении catch.

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

0 голосов
/ 13 апреля 2010

То, как вы справляетесь с этими исключениями, будет в значительной степени зависеть от того, что вы хотите сделать в случае, если что-то пойдет не так. Вы можете, как вы говорите, просто написать result = false в своих блоках catch, но это означает, что вы просто говорите вызывающей функции: «Эй, некоторые записи не были обработаны - живите с этим ...». Это может быть достаточно для вас - это зависит от того, что вы пытаетесь сделать.

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

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

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

0 голосов
/ 13 апреля 2010

Я думаю, что это может быть что-то подобное

    int count = 0;
    foreach( item in list)
    {

    try
    {
     //update DB
     ++count;
    }
    catch(Exception ex)
    {
         //log exception
    }
    if(count == list.Count)
      return true;
     else return false;

   }

Другой способ

 bool result = true;
 foreach( item in list)
 {

   try
   {
     //update DB
   }
   catch(Exception ex)
   {
      //log exception
      result = false;
   }
  return result;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...