Подтвердить что ты не робот

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

Использует ли использование catch исключение или бросает его? т.е.

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

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

4b9b3361

Ответ 1

с использованием утверждений не есть исключения.

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 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! 
}

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

Это брошено.

Ответ 12

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

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