web-dev-qa-db-fra.com

Essayez enfin: faites quelque chose si aucune exception n'est levée

Je me demande s'il existe un moyen d'exécuter un blocage uniquement si aucune exception n'a été levée.

Le mieux que je puisse trouver est la suivante:

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}finally{
    if(!exception){
        // i can do what i want here
    } 
}

Y a-t-il un meilleur moyen?

21
lowerkey

Bien sûr, placez-le au bas du bloc try.

try{
    // something
    // i can do what i want here
}catch(Exception e){
    // handle exception
}

Ce n'est pas tout à fait équivalent à votre code d'origine en ce sens que si "ce que vous voulez" lève, l'exception sera interceptée localement (cela ne se produirait pas avec votre schéma d'origine). C’est quelque chose qui peut vous intéresser ou non, et il est fort probable que le comportement différent soit également le bon.

Si vous souhaitez rétablir l'ancien comportement, vous pouvez également utiliser cette variante qui ne nécessite pas de finally uniquement pour écrire la condition "si aucune exception":

var checkpointReached = false;
try{
    // something
    checkpointReached = true;
    // i can do what i want here
}catch(Exception e){
    if (checkpointReached) throw; // don't handle exceptions after the checkpoint
    // handle exception
}
42
Jon

Pouvez-vous structurer votre code de sorte que la variable doSomething soit la dernière instruction du bloc et qu'elle ne soit pas renvoyée?

bool exception = false;
try{
  // something
  doSomething();
} catch {
}
finally {
}
5
Jeff Foster

Vous n'avez pas besoin de la clause finally.

Une solution :

bool exception = false;
try{
    // something
}catch(Exception e){
    exception = true;
}
if(!exception){
     // u can do what u want here
} 

Habituellement, vous aurez simplement un retour dans votre clause catch afin que vous n'ayez même pas à tester:

try{
    // something
}catch(Exception e){
   // do things
   return;
}
// u can do what u want here

ou (en fonction du cas d'utilisation et généralement moins clair, surtout si vous attendez plus d'une exception - vous ne voulez pas d'imbrications try-catch ...):

try{
    // something
    // u can do what u want here
}catch(Exception e){
   // do things
}
4
Denys Séguret

Oui, il y en a: Le mettre à la fin du bloc try :)

3
Sebastian Breit

Nope - ce que vous avez est probablement la meilleure façon de le faire en C #.

Ceci en supposant que:

  • Vous ne voulez pas que le "je puisse faire ce que je veux ici" code soit exécuté au bas de votre bloc try. (Peut-être parce que vous ne voulez pas que les exceptions dans ce code soient gérées par le bloc principal catch.)
  • Vous ne voulez pas que le "je puisse faire ce que je veux ici" code s'exécute entièrement en dehors de la structure try...catch...finally. (Peut-être parce que vous voulez que ce code soit exécuté avant un autre code se trouvant dans le bloc finally.)
1
LukeH

Bien qu'il n'y ait rien de mal avec votre code, c'est inutile. Placez simplement le code que vous souhaitez exécuter au bas du bloc try:

try {
    ...
    // No errors to this point, run what you wanted to run in the finally.
}
catch(Exception e) {
    ...
}
1
James Hill

Je crois que vous cherchez un essai dans votre essai:

try{
    // something

    try{
        // something else not interfering with first try
    } catch(Exception innerEx){
        // something else threw this innerEx
    }

}catch(Exception outerEx){
    // something threw this outerEx
}

Bien que cela soit généralement considéré comme une mauvaise pratique, je l’aime plus que la version drapeau.

0
user2202609