2017-09-26 2 views
2

Considérons un peu artificielle C++ Code:C++ avec succès `try` branche

int i = 0; 

try { someAction(); } 
catch(SomeException &e) { i = -1; } 

i = 1; 

... // code that uses i 

Je veux que ce code pour assigner -1 à i en cas de someAction() throws Exception et assignez 1 au cas où il n'y avait pas exception. Comme vous pouvez le voir maintenant ce code est faux parce que i finit toujours par devenir 1. Bien sûr, nous pouvons faire quelques solutions de contournement truc comme:

int i = 0; 
bool throwed = false; 

try { someAction(); } 
catch(SomeException &e) { throwed = true; } 

i = throwed ? -1 : 1; 

... // code that uses i 

Ma question est: est-il quelque chose en C++ comme « branche d'essai avec succès », où je fais des actions au cas où il n'y avait pas tout lancers francs dans le bloc d'essai? Quelque chose comme:

int i = 0; 

try { someAction(); } 
catch(SomeException &e) { i = -1; } 
nocatch { i = 1; } 

... // code that uses i 

Certes, il n'y a pas nocatch en C++ mais peut-être il y a une solution de contournement belle commune?

+0

Le "nocatch" est appelé "try". – molbdnilo

+0

Vous pouvez avoir plusieurs lignes de code dans un bloc try ou catch. – AndyG

+4

Une façon consiste à initialiser 'i' à' 1'. C'est le plus simple. Une autre méthode consiste à placer votre code dans une fonction (par exemple un lambda) et à renvoyer la valeur «i». –

Répondre

11
int i = 0; 

try { someAction(); i = 1; } 
catch(SomeException &e) { i = -1; } 
+8

Il suffit d'initialiser 'i' à' 1'. Pas besoin de placement fragile de l'affectation. EDIT: Je ne comprends pas les upvotes d'une réponse qui est si courte et préconise toujours inutilement le code fragile. –

+0

@ Cheersandhth.-Alf: Vous avez raison de dire que l'initialisation 'i' à' 1' est plus simple, mais pouvez-vous m'aider à comprendre pourquoi ce code est fragile? – AndyG

+2

@AndyG: Cela dépend de l'affectation de 'i' en dernier dans le bloc' try', après tout ce qui peut être lancé. La maintenance pourrait changer cela. –

0

En dehors de la solution simple

try 
{ 
    someAction(); 
    i = 1; 
} 
catch(SomeException &e) 
{ 
    i = -1; 
} 

vous devriez considérer ce que vous envisagez de faire avec la valeur de i plus loin dans le code - l'utiliser dans if déclarations? C'est une mauvaise conception, vous pouvez simplement mettre tout le code à l'intérieur des accolades après try et catch respectivement.