Domanda

Sto cercando di sfruttare sempre di più il blocco using in questi giorni quando ho un oggetto che implementa IDisposable ma una cosa che non ho capito è come catturare un'eccezione come farei in un normale try/catch/finally...qualche esempio di codice che mi indichi la giusta direzione?

Modificare:La domanda è stata modificata dopo aver letto le risposte.Era "Come lanciare un'eccezione in un blocco usando .NET 2.0?" Ma in realtà stavo cercando un modo per catturare queste eccezioni all'interno di un blocco usando.


Sto cercando maggiori dettagli su come far rotolare il mio blocco di cattura all'interno di un blocco di utilizzo.

Modificare:Quello che volevo evitare è dover usare un try/catch/finally all'interno del mio blocco using come ha mostrato @Blair.Ma forse questo non è un problema...

Modificare:@Blair, questo è esattamente quello che stavo cercando, grazie per la risposta dettagliata!

È stato utile?

Soluzione

Non capisco davvero la domanda: lanci un'eccezione come faresti normalmente.Se MyThing implementa IDisposable, Poi:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

E thing.Dispose verrà chiamato quando lasci il blocco, poiché viene lanciata l'eccezione.Se vuoi combinare try/catch/finally e using, puoi annidarli:

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}    

(Oppure metti prova/cattura/finalmente nell'uso):

using ( MyThing thing = new MyThing() )
{
    ...
    try
    {
        ...
    }
    catch ( Exception e )
    {
        ....
    }
    finally
    {
        ....
    }    
    ...
} // thing.Dispose is called now

Oppure puoi srotolare il using e chiamare esplicitamente Dispose nel finally block come ha dimostrato @Quarrelsome, aggiungendo qualsiasi codice aggiuntivo di gestione delle eccezioni o di ripristino di cui hai bisogno nel file finally (o nel catch).

MODIFICARE:In risposta a @Toran Billups, se è necessario elaborare le eccezioni oltre a garantire che il proprio file Dispose viene chiamato il metodo, dovrai utilizzare a using E try/catch/finally o srotolare il using - Non credo che ci sia altro modo per ottenere ciò che desideri.

Altri suggerimenti

Sì, non c'è niente di diverso nel lanciare eccezioni nell'uso dei blocchi.Ricorda che il blocco using si traduce sostanzialmente in:

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

Quindi dovrai lanciare la tua cattura se vuoi catturare qualcosa, ma catturare/lanciare è una preoccupazione completamente separata dall'utilizzo.L'esecuzione di Finalmente è quasi garantita (salvo un'eccezione non rilevabile (ad es.stackoverflow o memoria insufficiente) o qualcuno che stacca l'alimentazione dal PC).

È necessario disporre di un'istruzione try per rilevare un'eccezione

È possibile utilizzare un'istruzione try all'interno del blocco using oppure è possibile utilizzare un blocco using in un blocco try

Ma è necessario utilizzare un blocco try per rilevare eventuali eccezioni che si verificano

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