2010-07-26 7 views
2

Des exceptions peuvent-elles être interceptées dans un bloc using, et si oui, quelle est la syntaxe?Pouvez-vous attraper dans un bloc utilisant?

Donc, quelque chose comme ce qui suit:

using (var creatingThing = new MyCreatingThing()) 
{ 
    creatingThing.CreateSomething(); 

    catch() 
    { 
     creatingThing.Rollback(); 
    } 
} 

peut-il être fait? Ou dois-je écrire ce code manuellement (c'est-à-dire sans utiliser)?

Répondre

15

Vous pouvez mettre un try/catch dans la déclaration using, ou à l'extérieur:

using (...) 
{ 
    try 
    { 
     ... 
    } 
    catch 
    { 
     ... 
    } 
} 

ou ...

try 
{ 
    using (...) 
    { 
     ... 
    } 
} 
catch 
{ 
    ... 
} 

Cependant, vous ne pouvez pas mettre un bloc catch sans bloc try. Choisissez le bon en fonction de si vous avez besoin d'intercepter les exceptions qui sont lancées par l'expression d'acquisition de ressources, si vous voulez que la ressource soit éliminée avant que votre bloc catch soit exécuté et si vous avez besoin d'accéder à la variable de ressource dans le bloc de capture.

+0

Jon, dans votre deuxième exemple de code, si une exception est lancée dans la partie using du bloc try, la ressource sera-t-elle toujours éliminée? –

+2

@Maxim: Oui, absolument. –

6

Vous ne pouvez pas implicitement vous inscrire dans le bloc try...finally généré par le compilateur (pour l'instruction using). Vous devez ajouter une autre déclaration try, qui sera imbriqué dans le bloc généré:

using (var creatingThing = new MyCreatingThing()) 
{ 
    try 
    { 
     creatingThing.CreateSomething(); 
    } 
    catch 
    { 
     creatingThing.Rollback(); 
    } 
} 
+2

Mais ce ne sera pas attraper une exception lancée par le constructeur (bien que l'action qu'il a dans la capture serait un problème si le ctor a jeté l'exception) –

+0

ok, donc il n'y a aucun moyen de se brancher sur l'implicite 'try ... finally' créé par l'utilisation? – fearofawhackplanet

+0

@fear: Correct. –

3

Bien sûr, ajoutez simplement l'essayer dans l'utilisation de:

using (var creatingThing = new MyCreatingThing()) 
{ 
    try 
    { 
    creatingThing.CreateSomething(); 
    } 
    catch(Exception ex) 
    { 
     creatingThing.Rollback(); 
    } 
} 
+0

Cette syntaxe est incorrecte. –

+0

@steven: Oui, je voulais juste montrer comment ajouter le bit 'try' donc ne vous inquiétez pas pour le reste, mais il est probablement préférable que tout soit correct. –

+1

Aucun mal fait. C'est pourquoi je préfère commenter au lieu de baisser aveuglément. :-) –

6

Remarque, l'un à l'aide est vraiment un try/finally sous les couvertures, il peut être plus facile le code de cette façon:

MyCreatingThing creatingThing = null; 
try 
{ 
    creatingThing = new MyNCreatingThing()) 
    creatingThing.CreateSomething(); 
}  
catch() 
{ 
     Console.WriteLine("An Exception happened"); 
     if (creatingThing !=null) 
      creatingThing.Rollback(); 
} 
finally 
{ 
     if (creatingThing !=null) 
      creatingThing.Dispose(); 
} 
+2

Vous pourriez vouloir lancer 'creatingThing' à' IDisposable', au cas où il serait implémenté explicitement. –

Questions connexes