2008-08-30 5 views
4

J'essaie de tirer de plus en plus parti du bloc using quand j'ai un objet qui implémente IDisposable mais une chose que je n'ai pas compris c'est comment attraper une exception comme je le ferais dans un try/catch/finally normal. .. des échantillons de code pour me diriger dans la bonne direction?Comment faire pour attraper une exception dans un bloc using avec .NET 2.0?

Modifier: La question a été modifiée après avoir lu les réponses. C'était "Comment lancer une exception dans un bloc utilisant avec .NET 2.0?" mais je cherchais en fait un moyen d'attraper ces exceptions dans un bloc utilisant.


Je suis à la recherche de plus de détails sur le roulement de mon propre bloc de capture à l'intérieur d'un bloc utilisant. Edit: Ce que je voulais éviter est d'utiliser un try/catch/finally dans mon bloc using comme @Blair a montré. Mais peut-être que ce n'est pas un problème ...

Modifier: @Blair, c'est exactement ce que je cherchais, merci pour la réponse détaillée!

Répondre

7

Je ne comprends pas vraiment la question - vous lancez une exception comme vous le feriez normalement. Si MyThing outils IDisposable, puis:

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

Et thing.Dispose seront appelés que vous quittez le bloc, comme jeté de l'exception. Si vous souhaitez combiner un try/catch/finally et en utilisant, vous pouvez imbriquer:

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

(Ou mettre le try/catch/finally dans l'utilisation de):

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

Ou vous pouvez dérouler le using et appeler explicitement le Dispose dans le bloc finally comme l'a démontré @Quarrelsome, en ajoutant tout code supplémentaire de traitement ou de récupération d'exception dont vous avez besoin dans le finally (ou dans le catch).

EDIT: En réponse à @Toran Billups, si vous avez besoin de traiter les exceptions en dehors de veiller à ce que votre méthode Dispose est appelée, vous devez soit utiliser un using et try/catch/finally ou déroulez le using - je ne pense pas il y a un autre moyen d'accomplir ce que vous voulez.

4

Oui, il n'y a rien de différent à lancer des exceptions dans l'utilisation des blocs. Rappelez-vous que le bloc en utilisant essentiellement à se traduit par:

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

Vous devrez rouler votre propre attraper si vous voulez attraper quoi que ce soit, mais la capture/lancer est une préoccupation tout à fait distincte de l'utiliser. Le final est presque garanti pour s'exécuter (enregistrer une exception inaccessible (par exemple stackoverflow ou outofmemory) ou quelqu'un tirant le pouvoir du PC).

0

Vous devez avoir une déclaration d'essayer d'attraper une exception

Soit vous pouvez utiliser une instruction try dans le utilisant bloc ou vous pouvez utiliser un aide de bloc dans un bloc try

Mais vous devez utiliser un bloc try pour intercepter les exceptions survenues

Questions connexes