Pregunta

En base a lo escrito en este Página web, y si entiendo correctamente, el using declaración funciona como un try/finally, por lo que podría esperar erróneamente que si ocurre una excepción en un using declaración, no debería bloquear el programa.

Sin embargo, cuando el DownloadString método, que se muestra en el siguiente ejemplo, arroja un WebException, el programa falla.

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

Esto es normal, ya que el using La declaración no funciona como una try/catch/finally, entonces en realidad no se maneja ninguna excepción.Pero luego me pregunto cuál es el propósito de la using declaración.

ACTUALIZAR... Con base en las respuestas a continuación, agrego las siguientes consideraciones.Básicamente, si necesito manejar una excepción, las posibles soluciones podrían ser las siguientes.

  1. Pon el using declaración dentro de un try/catch bloquear.
  2. Pon solo el DonwloadString método dentro de un try/catch bloquear.
  3. Escriba manualmente un bloque try/catch/finally como en el siguiente ejemplo de código.

Código de muestra para la tercera solución.

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
¿Fue útil?

Solución

Si entiendo correctamente, la declaración de uso funciona como un intento/finalmente

Correcto.

por lo que esperaría que si ocurre una excepción en una declaración de uso, no bloquee el programa.

Incorrecto.

Ni try/finally ni using Las declaraciones tragan excepciones: si no detecta la excepción, se propagará hacia arriba.Si no se detecta, normalmente finalizará el proceso.(Hay algunos casos en los que no lo hará, según en qué subproceso se encuentre y cómo esté configurado CLR, pero ese es un asunto diferente).

Pero luego me pregunto cuál es el propósito de la declaración de uso.

Para simplificar la escritura de código que necesita disponer de recursos.Eso es todo.Si no tuviéramos using declaraciones, tendríamos un lote de try/finally bloques que acaban de llamar Dispose...y eso sería considerablemente más feo.(He estado allí, lo he hecho; eso era Java hasta que Java 7 introdujo la declaración de prueba con recursos).

Otros consejos

A using declaración no hace que todas las excepciones desaparezcan mágicamente, sólo significa que IDisposable.Dispose El método se llama correctamente en el client objetar si esto ocurre.Esto es importante para garantizar que se liberen los recursos no administrados.

Volverá a generar cualquier excepción que ocurra y aún tendrás que manejarla en tu propio código.

Consulte MSDN Descripción de la Declaración de using

En resumen, el uso de garantiza que se llama .Dispose() incluso si se produce una excepción.Sin embargo, no es detener la excepción de hacerlo.

La instrucción Uso no tiene una captura, solo una finalmente y, por lo tanto, dispone del recurso para usted.Si la declaración de uso debía tomar todas las excepciones y continuar funcionando, sería un gran obstáculo para la depuración.

Es simplemente más fácil y más rápido para usar y leer

ver por ti mismo

var myVar = null
try
{
    my = new Object();
    //Do stuff
}
finally
{
    if(myVar != null)
        myVar.Dispose()
}

vs

using(var myVar = new Object())
{
    //Do stuff
}

Simplemente para asegurarse de que el dispondrá en ese objeto.El usando no hagas ningún manejo de excepciones como intento / finalmente, ya sea

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top