С# "Использование" Синтаксис
Использует ли использование catch исключение или бросает его? т.е.
using (StreamReader rdr = File.OpenText("file.txt"))
{
//do stuff
}
Если средство чтения потоков генерирует исключение, оно захватывается с помощью или выбрасывается, чтобы вызывающая функция могла его обрабатывать?
Ответы
Ответ 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" не использует исключения, он просто распоряжается ресурсами в случае необработанных исключений.
Возможно, вопрос в том, будет ли он распоряжаться ресурсами, выделенными в круглых скобках, если в декларации также возникла ошибка? Трудно представить, что и то и другое происходит.