Helfdane Ответов: 1

Вложенные блоки try/catch


Я несколько сомневаюсь в использовании вложенных блоков try/catch.

Ситуация, которая заставляет меня задуматься, - это следующая ситуация. Некоторые примеры кода для иллюстрации:

SqlConnection conn = new SqlConnection(connectionString);<br />conn.Open();<br />SqlTransaction trans = conn.BeginTransaction();<br /><br />try<br />{<br />string query = "query goes here";<br />SqlCommand command = new SqlCommand(query, conn, trans);<br />// add parameters<br />command.ExecuteNonQuery();<br />trans.Commit();<br />}<br />catch <br />{ <br />trans.Rollback();<br />}<br />finally<br />{<br />if(conn != null)<br />{<br />conn.Close();<br />conn.Dispose();<br />}<br />}

Этот блок имеет 1 блок try/catch, но проблема заключается в "conn.Открытая линия. При возникновении сетевой ошибки Конн.Open() вызовет исключение. Поставив управление кораблем.Open() в блоке try/catch сделает недействительным код, который теперь находится в предложениях catch/finally.

Таким образом, я могу использовать 2 последовательных блока try/catch или следующую конструкцию. Что вы, люди, думаете?


AnkitGoel.com

Пожалуйста, запишите свой код с правильным форматированием. Она совершенно нечитабельна. поэтому я ничем не могу помочь.

1 Ответов

Рейтинг:
0

Christian Graus

Это ничего не отменит. Вы можете просто поставить блок типа (if conn != null) в начале второй попытки/улова, и тогда ваш блок finally будет работать нормально. Действительно, командование.ExecuteNonQuery просто заставит поймать и, наконец, если conn будет равен нулю. Я также не уверен, почему conn не может быть в существующем блоке try, просто объявите trans снаружи него и начните его внутри.