используя & try / catch вложенность - PullRequest
10 голосов
/ 08 марта 2012

Этот вопрос больше относится к ПРАВИЛЬНОМУ способу что-то сделать ...

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

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

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

Является ли ...

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 { }
}

Ответы [ 4 ]

5 голосов
/ 08 марта 2012

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

2 голосов
/ 08 марта 2012

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

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

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

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

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

1 голос
/ 08 марта 2012

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

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

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

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


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

0 голосов
/ 08 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...