2012-03-08 2 views
10

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

Вопрос ... есть правильный раскрой порядок между using блока и try/catch?

Согласны ли вы встраивать всю инструкцию using внутри try/catch и поддерживать преимущества блока using? (или исключение приведет к тому, что закрывающая часть оператора использования будет выбрасываться из окна)

Или вы должны вставить try/catch в операторы using и окружать только операторы, поддерживающие доступ к базе данных?

Is ...

try { 
    using(tsmtcowebEntities db = new tsmtcowebEntities()) { 
      violationList = (from a in db.DriverTrafficViolationDetails 
          where a.DriverTrafficViolation.DriverApplicationId == DriverAppId 
          orderby a.DateOfOccurance descending 
          select a).ToList<DriverTrafficViolationDetail>(); 
      GeneralViolation = (from a in db.DriverTrafficViolations 
           where a.DriverApplicationId == DriverAppId 
           select a).FirstOrDefault(); 
    } 
} catch { } 

менее/более правильно, чем ...

using(tsmtcowebEntities db = new tsmtcowebEntities()) { 
    try { 
      violationList = (from a in db.DriverTrafficViolationDetails 
          where a.DriverTrafficViolation.DriverApplicationId == DriverAppId 
          orderby a.DateOfOccurance descending 
          select a).ToList<DriverTrafficViolationDetail>(); 
      GeneralViolation = (from a in db.DriverTrafficViolations 
           where a.DriverApplicationId == DriverAppId 
           select a).FirstOrDefault(); 
    } catch { } 
} 
+0

Вам действительно нужны все детали вашего приложения в предоставленном коде? Я думаю, что достаточно простого придуманного примера. –

+1

Пустой блок блокировки - очень плохая практика программирования. Не делай этого! Вы пожалеете об этом позже. – phoog

+0

@JonathonReinhart Мне было проще копировать и вставлять блок кода, чем составлять пример. Я составляю код, когда чувствую, что поставить код для мира может быть плохо. В этом случае я не вижу никаких негативов, так почему бы и нет? – Jared

ответ

5

Позже лучше: он избежит маскировки исключений, в конце концов брошенных dy dispose. См. Это article.

+1

+1 для указания на это: однако любой Dispose, который генерирует исключение, уже «плохой» в моей книге :( –

+0

Если вы явно не хотите поймать ошибки, вызванные оператором using. Что-то вроде использования (FileStream fs = new FileStream (... может легко метаться, если путь является недопустимым или недоступным, и может быть даже более вероятным бросить, чем содержимое вашего используемого блока. –

0

Я хотел бы предложить размещение TRY/поймать в пределах использования, потому что независимо от того, или не является исключением бросок, вы должны распоряжаться типами контейнера одноразового объекта

+0

Я предполагаю, что это было частью моего вопроса. Я был на 100% положительным в функциональности вложенности try/catch внутри использования. Я был более неуверен, если оператор using мог обрабатывать обратный и все еще распоряжаться объектом/ресурсами ... У меня есть код, над которым я работаю, и в настоящее время он работает в обоих направлениях. Я пытаюсь выяснить, нужно ли мне пройти через код и убедиться, что try/catch всегда вложен или нет. Вы подтвердили, что я изначально ожидал, поэтому я приму ответ! @GlennFerrieLive – Jared

+0

'использование' делает свою попытку поймать. Функция 'dispose' всегда будет вызываться. –

+1

-1 Dispose будет вызываться независимо от гнездования. @Jared: использование скомпилировано в try-finally (не try-catch, как сказал J.N.). Dispose вызывается в блоке finally, поэтому он вызывается, поймано или обработано исключение. – phoog

2

Это действительно вопрос стиля и насколько вы хотите сохранить объем db:

Если использование находится внутри блока try/catch, то переменная db будет доступна только в пределах части try.

Если использование находится вне блока try/catch, он будет виден внутри участка улова.

Независимо от того, что переменная будет удалена правильно, поскольку используемый блок является эквивалентом try/finally.

Лично мне было бы интересно, почему вам нужно вообще есть исключения и что, если что-нибудь, вы можете с ними сделать.

+0

Я часто использую try/catch для установки кода состояния для ответа на мои действия, вызываемые через ajax. – Jared

1

using гнезда предсказуемо с try/catch и Dispose будут называться все по дорогам. Предсказуемо означает, что управление всегда вытекает из внутренних -> внешних областей (как для Исключений, так и для нормального возврата потока).

Вопрос заключается в том, то: , когда если улова быть выполнен в связи с Dispose и , что должен объемом улова быть? Ответ на этот вопрос будет зависеть от кода, но должен быть «внутри», если требуется доступ к db и «снаружи», если код выполнен как частьusing * может быть источником исключения.

(Кроме того, пустые уловы блоки неприглядные! Я предполагаю, что они там «для демонстрационных целей».)

День кодирование.


* Обратите внимание, что внешний улов будет перехватывать исключения из new tsmtcowebEntities() или (как было отмечено J.N.) в Dispose, если таковые существуют. (Это еще одна тема, если это приемлемо для любой конструкции, чтобы исключить исключение ;-) Я предпочитаю ловить исключения как можно ближе к источнику, и позволяю исключениям, которые я не знаю, как бороться с «выкачиванием» неотображаемым кроме в некоторых конструкциях верхнего уровня (например, обработчики событий).

+0

На самом деле у меня есть несколько мест в моем коде просто потому, что у меня есть Elmah, чтобы поймать любой Исключение. В моем списке дел нужно вернуться и перефакторировать много кода, и мои блоки try/catch являются одной из этих областей, а также улучшают настройку регистрации ошибок, которые у меня есть. – Jared

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