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?
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
}
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 {
}
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
}
Oui, il y en a: Le mettre à la fin du bloc try :)
Nope - ce que vous avez est probablement la meilleure façon de le faire en C #.
Ceci en supposant que:
try
. (Peut-être parce que vous ne voulez pas que les exceptions dans ce code soient gérées par le bloc principal catch
.)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
.)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) {
...
}
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.