Какова цель использования оператора?
-
24-12-2019 - |
Вопрос
На основании того, что здесь написано веб-страница, и если я правильно понимаю, то using
утверждение работает как try/finally
, поэтому я могу ошибочно ожидать, что если исключение произойдет в using
заявление, это не должно привести к сбою программы.
Однако, когда DownloadString
метод, показанный в примере ниже, выдает WebException
, программа выходит из строя.
using (WebClient client = new WebClient())
{
string response = client.DownloadString(url);
// ...
}
Это нормально, поскольку using
утверждение не работает как try/catch/finally
, то фактически никакое исключение не обрабатывается.Но тогда мне интересно, какова цель using
заявление.
ОБНОВЛЯТЬ... Основываясь на приведенных ниже ответах, я добавлю следующие соображения.По сути, если мне нужно обработать исключение, возможные решения могут быть следующими.
- Положите
using
заявление внутриtry/catch
блокировать. - Ставьте только
DonwloadString
метод внутриtry/catch
блокировать. - Напишите вручную блок try/catch/finally, как показано в следующем примере кода.
Пример кода для третьего решения.
WebClient client = new WebClient();
try
{
string response = client.DownloadString(url);
// ...
}
catch(Exception ex)
{
// handle (or ignore) the exception
}
finally
{
if (client != null)
client.Dispose();
}
Решение
если я правильно понимаю, оператор using работает как попытка/наконец
Правильный.
поэтому я ожидаю, что если в операторе использования возникнет исключение, это не приведет к сбою программы.
Неверно.
Ни один try/finally
ни using
операторы поглощают исключения - если вы не перехватите исключение, оно распространится вверх.Если он не перехвачен, процесс обычно завершается.(Есть несколько случаев, когда этого не произойдет, в зависимости от того, в каком потоке он находится и как настроена CLR, но это другой вопрос.)
Но тогда мне интересно, какова цель использования оператора.
Чтобы упростить написание кода, который должен распоряжаться ресурсами.Вот и все.Если бы у нас не было using
заявления, у нас будет много из try
/finally
блоки, которые только что вызвали Dispose
...и это было бы значительно уродливее.(Был там, сделал это - это была Java, пока в Java 7 не появился оператор try-with-resources.)
Другие советы
А using
утверждение не приводит к волшебному исчезновению всех исключений, оно просто означает, что IDisposable.Dispose
метод правильно вызывается на client
возражать, если таковое происходит.Это важно для обеспечения освобождения всех неуправляемых ресурсов.
Он будет повторно генерировать любые возникающие исключения, и вам все равно придется обрабатывать их в своем собственном коде.
См. описание MSDN using
заявление
Короче говоря, использование гарантирует, что .Dispose()
вызывается даже в случае возникновения исключения.Однако это не мешает исключению выполнять свою работу.
Оператор using НЕ имеет подвоха, а имеет только окончание и, таким образом, удаляет ресурс за вас.Если бы оператор using перехватывал все исключения и продолжал работать, это было бы большим препятствием для отладки.
Просто проще и быстрее использовать и читать
посмотреть на себя
var myVar = null
try
{
my = new Object();
//Do stuff
}
finally
{
if(myVar != null)
myVar.Dispose()
}
против
using(var myVar = new Object())
{
//Do stuff
}
Это просто для того, чтобы убедиться, что Утилизировать вызывается на этом объекте.А с использованием не выполняйте никакой обработки исключений, как и try/finally.