Domanda

Sulla base di ciò che è scritto su questo Pagina Web , e se capisco correttamente, l'istruzione using funziona come un try/finally, quindi potrei erroneamente aspettare che se si verifica un'eccezione in un'istruzione using, non dovrebbe bloccare il programma.

Tuttavia, quando il metodo DownloadString, mostrato nell'esempio seguente, lancia un WebException, il programma si blocca.

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

È normale, poiché l'istruzione using non funziona come un try/catch/finally, in realtà non viene gestita alcuna eccezione. Ma poi mi chiedo quale sia lo scopo dell'istruzione using.

Aggiornamento ... In base alle risposte qui sotto, aggiungo le seguenti considerazioni. Fondamentalmente, se ho bisogno di gestire un'eccezione, le possibili soluzioni potrebbero essere le seguenti.

    .
  1. Metti l'istruzione using all'interno di un blocco try/catch.
  2. Metti solo il metodo DonwloadString all'interno di un blocco try/catch.
  3. Scrivi manualmente un blocco Try / Catch / Finalmente come nel seguente campione di codice.
  4. Codice di esempio per la terza soluzione.

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

È stato utile?

Soluzione

.

Se capisco correttamente, l'uso dell'utilizzo funziona come una prova / infine

corretto.

.

Quindi mi aspetterei che se un'eccezione si verifica in una dichiarazione usando, non dovrebbe bloccare il programma.

errato.

try/finally né le dichiarazioni using ingoiare eccezioni - Se non prendi l'eccezione, si propaga. Se è non rilevato, di solito terminerà il processo. (Ci sono alcuni casi in cui non lo farà, in base a quale discussione è dentro e come è configurato il CLR, ma è una questione diversa.)

.

Ma poi mi chiedo quale sia lo scopo dell'istruzione usando.

Per renderlo più semplice per scrivere il codice che deve disporre di risorse. È tutto. Se non avessimo dichiarazioni using, avremmo avuto un lotto di blocchi try / finally che hanno appena chiamato Dispose ... e questo sarebbe considerevolmente più brutto. (Stato lì, fatto quello - è stato Java fino a quando Java 7 ha introdotto la dichiarazione di prova con risorse.)

Altri suggerimenti

Un'istruzione using non rende tutte le eccezioni che scompaiono magicamente, significa solo che il metodo IDisposable.Dispose viene chiamato correttamente sull'oggetto client se si verifica uno.Questo è importante per assicurarti che vengano rilasciate risorse non gestite.

ritornerà tutte le eccezioni che si verificano e dovrai comunque gestirle nel tuo codice.

Vedi MSDN Descrizione dell'istruzione using

In breve, l'utilizzo garantisce che .Dispose() sia chiamato anche se si verifica un'eccezione.Non interrompe tuttavia l'eccezione di fare la sua cosa.

L'istruzione Uso non ha una cattura, solo un infine e quindi dispone della risorsa per te.Se l'uso dell'utilizzo dovesse catturare tutte le eccezioni e continuare a funzionare sarebbe un grande ostacolo al debug.

È semplicemente più facile e veloce da usare e leggere

Vedi per te

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

vs

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

Semplicemente per assicurarti che display è chiamato su quell'oggetto. usando non fare alcuna maneggevolezza di eccezione come prova / finalmente non è

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top