Использование & try/catch nesting

Этот вопрос скорее является тем, что является ПРАВЫМ способом сделать что-то...

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

Можно ли встраивать весь оператор using внутри try/catch и поддерживать преимущества блока using? (или исключение приведет к тому, что закрывающая часть оператора 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 { }
}

Ответ 1

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

Счастливое кодирование.


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

Ответ 4

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