WedX - журнал о программировании и компьютерных науках

C # Использование синтаксиса

Улавливает ли использование исключение или вызывает его? т.е.

using (StreamReader rdr = File.OpenText("file.txt"))
{
 //do stuff
}

Если Streamreader выдает исключение, он перехватывается с помощью или генерируется, чтобы вызывающая функция могла его обработать?


Ответы:


1

Операторы using не едят исключений.

Все, что делает "Using", - это ограничивает ваш объект используемым блоком и автоматически вызывает Dispose () для объекта, когда он покидает блок.

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

29.09.2008
  • Я почти уверен, что ваша ошибка не точна. Поскольку класс StreamReader реализует IDisposable, оператор using позаботится об удалении объекта. Поскольку оператор using действует как блок finally, не имеет значения, есть ли у вас исключение или возврат. 29.09.2008
  • Согласно msdn.microsoft.com/en-us/library/, операторы catch и finally все еще выполняются. Поскольку в качестве блока finally используются компиляции, читатель цепочек в вашем примере будет удален. 29.09.2008
  • Я согласен с двумя предыдущими комментариями. В дополнение к приведенному выше комментарию @Uhall, ThreadAbortException не прерывает поток, а просто перехватывает исключение, которое возникает в результате. 29.09.2008
  • Совершенно верно ... это происходит только в случае принудительного прерывания потока, а не при генерации исключения. Обновление ответа. 29.09.2008

  • 2

    Когда вы видите оператор using, подумайте об этом коде:

    StreadReader rdr = null;
    try
    {
        rdr = File.OpenText("file.txt");
        //do stuff
    }
    finally
    {
        if (rdr != null)
            rdr.Dispose();
    }
    

    Итак, настоящий ответ заключается в том, что он ничего не делает, за исключением исключения, созданного в теле блока using. Он не справляется с этим и не бросает его заново.

    29.09.2008

    3

    using позволяет исключению «выскочить». Он действует как попытка / наконец, где наконец удаляет использованный объект. Таким образом, он подходит / полезен только для объектов, реализующих IDisposable.

    29.09.2008

    4

    Он генерирует исключение, поэтому либо ваш содержащий метод должен его обработать, либо передать его в стек.

    try
    {
        using (
            StreamReader rdr = File.OpenText("file.txt"))
        { //do stuff 
        }
    }
    catch (FileNotFoundException Ex)
    {
        // The file didn't exist
    }
    catch (AccessViolationException Ex)
    {
        // You don't have the permission to open this
    }
    catch (Exception Ex)
    {
        // Something happened! 
    }
    
    29.09.2008

    5

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

    Однако следует остерегаться того, что если в выражении инициализации возникает исключение, то метод Dispose () не будет вызываться для переменной выражения. Это почти всегда то поведение, которое вы хотели бы, поскольку вы не хотите беспокоиться об удалении объекта, который на самом деле не был создан. Однако проблема может возникнуть в сложных обстоятельствах. То есть, если несколько инициализаций скрыты внутри конструктора и некоторые из них завершаются успешно до того, как было выбрано исключение, тогда вызов Dispose может не произойти в этой точке. Однако обычно это не проблема, поскольку конструкторы обычно остаются простыми.

    29.09.2008
  • Это всегда поведение, которое вы хотите. Если несколько инициализаций скрыты внутри конструктора, конструктор должен управлять любой необходимой очисткой. Никакой внешний код не может этого сделать, поскольку объект фактически не будет создан. 29.09.2008
  • @ Джо, я пытаюсь показаться умным. Перестань указывать на изъяны моей логики! 29.09.2008

  • 6

    В вашем примере, если File.OpenText выдает ошибку, Dispose не будет вызываться.

    Если исключение происходит в //do stuff, будет вызываться Dispose .

    В обоих случаях исключение обычно распространяется за пределы области видимости, как это было бы без оператора using.

    04.05.2011

    7

    Если вы специально не поймаете исключение, оно будет подниматься в стек, пока что-то не произойдет.

    29.09.2008

    8

    Использование не мешает обработке исключений, кроме очистки всего, что находится в его области.

    Он не обрабатывает исключения, но позволяет исключениям проходить.

    29.09.2008

    9

    using гарантирует, что * созданный объект будет размещен в конце блока, даже если будет сгенерировано исключение. Исключение не перехвачено. Однако нужно быть осторожным с тем, что вы делаете, если пытаетесь поймать это самостоятельно. Поскольку любой код, перехватывающий исключение, находится за пределами блока области, определенного оператором using, ваш объект не будет доступен для этого кода.

    * за исключением обычных подозреваемых, таких как отключение электроэнергии, ядерный холокост и т. д.

    29.09.2008

    10

    Вы можете представить использование в качестве блока try ... finally без блока catch. В блоке finally вызывается IDisposable.Dispose, и, поскольку блока catch нет, любые исключения выбрасываются в стек.

    29.09.2008

    11

    "using" не перехватывает исключения, он просто освобождает ресурсы в случае необработанных исключений.

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

    29.09.2008
    Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]