Ответ 1
Позже лучше: он избежит маскировки исключений, которые в конечном итоге будут сброшены dy dispose
. См. Статью .
Этот вопрос скорее является тем, что является ПРАВЫМ способом сделать что-то...
Вопрос... есть ли правильный порядок вложенности между блоком 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 { }
}
Позже лучше: он избежит маскировки исключений, которые в конечном итоге будут сброшены dy dispose
. См. Статью .
Это действительно вопрос стиля и насколько вы хотите сохранить область db
:
Если использование находится внутри блока try/catch, переменная db
будет доступна только в пределах части try.
Если использование находится вне блока try/catch, оно будет видимым в пределах области catch.
Независимо от того, что переменная будет удалена правильно, потому что используемый блок является эквивалентом try/finally.
Лично мне было бы интересно, почему вам вообще нужно ловить исключения, и что, если угодно, вы можете с ними справиться.
using
гнездится предсказуемо с помощью try/catch
и Dispose
будет называться все по путям. Предсказуемо означает, что управление всегда течет из внутренних → внешних областей (как для Исключения, так и для нормального возврата потока).
Вопрос заключается в следующем: когда должен выполняться улов в отношении к Dispose
и какова должна быть область улова? Ответ на этот вопрос будет зависеть от кода, но должен быть "внутри", если требуется доступ к db
и "снаружи", если код, выполняемый как часть using
*, может быть источником исключения.
(Кроме того, пустые блоки блокировки icky! Я предполагаю, что они есть "для демонстрационных целей".)
Счастливое кодирование.
* Обратите внимание, что внешний catch поймает исключения, сброшенные из new tsmtcowebEntities()
или (как указано J.N.) Dispose
, если они существуют. (Это еще одна тема, если это приемлемо для любой конструкции, чтобы генерировать исключение;-) Я предпочитаю ловить исключения как можно ближе к источнику, и пусть исключения, которые я не знаю, как бороться с "истеканием", некоторые конструкторы верхнего уровня (например, обработчики событий).
Я бы предложил разместить try/catch в процессе использования, потому что независимо от того, выбрано ли исключение, вы должны распоряжаться типами контейнера одноразовых объектов