Вопрос

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

Однако, когда DownloadString метод, показанный в примере ниже, выдает WebException, программа выходит из строя.

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

Это нормально, поскольку using утверждение не работает как try/catch/finally, то фактически никакое исключение не обрабатывается.Но тогда мне интересно, какова цель using заявление.

ОБНОВЛЯТЬ... Основываясь на приведенных ниже ответах, я добавлю следующие соображения.По сути, если мне нужно обработать исключение, возможные решения могут быть следующими.

  1. Положите using заявление внутри try/catch блокировать.
  2. Ставьте только DonwloadString метод внутри try/catch блокировать.
  3. Напишите вручную блок 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top