2008-09-29 7 views
40

Использует ли использование исключения или бросает его? т.е.C# «Использование» Синтаксис

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

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

ответ

28

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

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

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

+7

Я абсолютно уверен, что ваша «гоча» неточна. Поскольку класс StreamReader реализует IDisposable, оператор using позаботится об утилизации объекта. Поскольку оператор using действует как блок finally, не имеет значения, есть ли у вас исключение или возврат. – 2008-09-29 17:12:31

+12

В соответствии с http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx команды catch и finally все еще выполняются. Поскольку «использование» компиляции в качестве блока finally, в вашем примере будет использоваться программатор-плейер. – Uhall 2008-09-29 17:14:36

2

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

15

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

+0

+1. `Попробовать/finally`. Большое спасибо! – xagyg 2013-05-14 22:10:38

2

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

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

0

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

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

60

Когда вы видите, используя заявление, думаю, этот код:

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

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

5

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

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! 
} 
2

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

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

1

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

3

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

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

3

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

Если исключение произошло в //do stuff, то назовем Dispose.

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

 Смежные вопросы

  • Нет связанных вопросов^_^