Быстрый способ найти шаблонные файлы можно создать и изменить для представления в Представлениях 2.0, к:
У меня были места, где это было бы полезно. Но чаще всего, когда я хочу это сделать, оказывается, что проблема в моем дизайне; Я пытаюсь обработать исключение не в том месте.
Вместо этого мне нужно позволить ему перейти на следующий уровень - обработать его в функции, которая вызвала этот код, а не прямо здесь.
Потому что вы «прячете» дополнительные функции внутри несвязанного ключевого слова.
Однако вы всегда можете написать это так
using (...) try
{
}
catch (...)
{
}
И таким образом линия представляет ваши намерения - использование заявление, которое также является попыткой
Интересная идея, но она может сбить с толку:
using (SqlConnection connection = new SqlConnection())
using (SqlCommand cmd = new SqlCommand())
{
connection.Open();
}
catch(Exception ex)
{
// Is connection valid? Is cmd valid? how would you tell?
// if the ctor of either throw do I get here?
}
, используя
Не имеет ничего общего с обработкой ошибок. Это сокращение от «вызывать Dispose, когда вы покидаете этот блок». Ваш второй пример кода вполне приемлем ... зачем возиться с тем, что работает?
На мой взгляд, вы смешиваете проблемы. Управление ресурсами (т.е. избавление от объектов) полностью отделено от обработки исключений. Сопоставление один-к-одному, которое вы описываете в своем вопросе, - это особый случай. Обычно обработка исключений не происходит в том же месте, где заканчивается область действия using. Или у вас может быть несколько областей try-catch внутри блока using. Или ...
Блок using - это просто синтаксический сахар для блока try-finally. Если вам нужно предложение catch, просто используйте try-catch-finally:
SqlConnection connection;
try
{
connection = new SqlConnection();
connection.Open();
}
catch(Exception ex)
{
// handle
}
finally
{
if (connection != null)
{
connection.Dispose();
}
}
Да, это больше кода, чем ваше теоретическое "using-catch"; Я считаю, что разработчики языка не считали это очень важным, и я не могу сказать, что когда-либо чувствовал его потерю.
Я рекомендую вам использовать пример №1 и №2 вместе. Причина в том, что ваш оператор using может, например, прочитать файл и вызвать исключение (например, файл не найден). Если вы его не поймаете, значит, у вас необработанное исключение. Помещение блока try catch внутри блока using будет улавливать только исключения, возникающие после выполнения оператора using. ИМХО, лучше всего сочетается ваш пример один и два.