2016-04-13 4 views
3

Какова наилучшая практика обработки исключений в пределах обработка исключений?Обработка исключений при обработке исключений

Я нахожу себя работающим над существующей системой C# (Framework 4.0), которая использует пользовательские объекты в catch и, наконец, блокирует на большинстве уровней Application Server.

Рассмотрим следующую надрезается версию метода в этом коде:

public void DoSomeStuff(string sGUID) 
    { 
     try 
     { 
      // Foo 
     } 
     catch (Exception oEx) 
     { 
      oExceptions.Add(oEx); 

      if (oDBConn.NumberOfActiveTrans > 0) 
      { 
       oDBConn.Rollback(); 
      } 
     } 
     finally 
     { 
      oDBConn.DeleteLocksByGUID(sGUID); 
     } 
    } 

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

Таким образом, было бы приемлемо использовать следующую обновленную версию или есть лучший способ выполнить одно и то же?

public void DoSomeStuff(string sGUID) 
    { 
     try 
     { 
      // Foo 
     } 
     catch (Exception oEx) 
     { 
      oExceptions.Add(oEx); 

      try 
      { 
       if (oDBConn.NumberOfActiveTrans > 0) 
       { 
        oDBConn.Rollback(); 
       } 
      } 
      catch (Exception oEEx) 
      { 
       oExceptions.Add(oEEx); 
      } 
     } 
     finally 
     { 
      try 
      { 
       oDBConn.DeleteLocksByGUID(sGUID); 
      } 
      catch (Exception oFEx) 
      { 
       oExceptions.Add(oFEx); 
      } 
     } 
    } 
+0

Я бы обработал откат транзакций в базе данных (например, с помощью хранимой процедуры для обновления/вставки данных). Таким образом, вам не нужно * 'try' откатывать транзакцию внутри блока' catch', когда вставка/обновление не выполняется в первом блоке 'try' *. (o.O) –

ответ

4

Я лично не хотел бы добавить try catch блок в finally, то это может быть бесконечной цепью. Обычно у вас не должно быть сложного материала в finally, и в любом случае в вызывающем абоненте должно быть обнаружено непредвиденное исключение.

Редактирование: немного ближе к коду, я не понимаю, почему код в конце не должен быть в блоке try.

+0

Я ценю желание сохранить сложность и простоту в отношении блока finally. Однако, в сценарии, когда система пытается убедиться, что определенная часть функциональности завершена, вы получите град дождя или блеска, будет ли попытка улов быть приемлемой в блоке finally? –

+1

, если вам нужно, может быть рефакторинг этого кода в метод с его собственным блоком try-catch и использовать этот метод в конце. Но не паникуйте, вызывающий должен поймать все неожиданные исключения, в том числе в блоке finally –

0

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

Не паникуйте. Если в слое db есть ошибка, попробуйте поймать его там.

0

Самая опасная вещь в исходном коде состоит в том, что если она не сработает и, то откат транзакций завершится неудачно, единственной ошибкой будет отказано в откате транзакции. Вы никогда не узнаете, что такое исходное исключение, из-за которого вам пришлось откатить транзакцию. Это то, о чем вы, вероятно, больше всего заботитесь.

Если вы хотите быть параноидальным, зарегистрируйте сбой отката транзакции. Но самое главное - это предыдущее исключение, которое привело вас к этому вопросу. Это должно быть зарегистрировано или обновлено в зависимости от ожидания вызывающего абонента.