why statements statement instruction end c# exception using using-statement

statements - C#"Utilizando" la sintaxis



using static c# (12)

¿El usuario atrapa la excepción o la arroja? es decir

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

Si el lector de secuencias arroja una excepción, ¿se captura utilizando o lanzando para que la función de llamada pueda manejarlo?


"usar" no detecta excepciones, solo dispone de recursos en caso de excepciones no controladas.

Tal vez la pregunta es, ¿podría disponer de los recursos asignados entre paréntesis si también se produce un error en la declaración? Sin embargo, es difícil imaginar que ambos sucedan.


Cualquier excepción que se genere en la expresión de inicialización de la instrucción using propagará el alcance del método y la pila de llamadas como se espera.

Una cosa a tener en cuenta, sin embargo, es que si se produce una excepción en la expresión de inicialización, entonces no se invocará el método Dispose () en la variable de expresión. Este es casi siempre el comportamiento que desea, ya que no desea molestarse en deshacerse de un objeto que en realidad no se creó. Sin embargo, podría haber un problema en circunstancias complejas. Es decir, si las inicializaciones múltiples están ocultas dentro del constructor y algunas tienen éxito antes de que se genere la excepción, entonces la llamada Dispose no puede ocurrir en ese punto. Sin embargo, esto no suele ser un problema, ya que los constructores generalmente se mantienen simples.


Cuando vea una instrucción using, piense en este código:

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

Entonces, la respuesta real es que no hace nada con la excepción lanzada en el cuerpo del bloque de uso. No lo maneja ni lo vuelve a lanzar.


El uso no interfiere con el manejo de excepciones aparte de limpiar cosas en su alcance.

No maneja las excepciones, pero deja pasar las excepciones.


En su ejemplo, si File.OpenText arroja, no se File.OpenText Dispose .

Si la excepción ocurre en //do stuff , se llamará al Dispose .

En ambos casos, la excepción normalmente se propaga fuera del alcance, como lo sería sin la instrucción using .


Es arrojado


Lanza la excepción, por lo que su método contenedor debe manejarlo o pasarlo a la pila.

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


Puedes imaginarte usando como un intento ... finalmente bloquear sin el bloque catch. En el bloque finally, se llama a IDisposable.Dispose, y como no hay ningún bloque catch, se generan excepciones en la pila.


Si no atrapas específicamente una excepción, se lanza a la pila hasta que algo lo haga


usar declaraciones no come excepciones.

Todo lo que "Utiliza" hace es enfocar su objeto al bloque de uso y llama automáticamente a Dispose () sobre el objeto cuando sale del bloque.

Sin embargo, hay una gotcha, si un hilo es abortado a la fuerza por una fuente externa, es posible que el Dispose nunca sea llamado.


using permite que la excepción hierva. Actúa como un try / finally, donde finalmente elimina el objeto usado. Por lo tanto, solo es apropiado / útil para objetos que implementan IDisposable .


using garantías * el objeto creado se eliminará al final del bloque, incluso si se lanza una excepción. La excepción no está atrapada. Sin embargo, debe tener cuidado con lo que hace si trata de atraparlo usted mismo. Como cualquier código que capte la excepción está fuera del bloque de alcance definido por la instrucción using , su objeto no estará disponible para ese código.

* salvo los sospechosos habituales como la falla de energía, el holocausto nuclear, etc.