2010-09-30 25 views
0

J'essaie d'attraper une exception 'spécifique' (FormatException^ou OverflowException ^), puis de la jeter et de l'attraper dans le bloc de capture 'exception générale' (Exception ^).C++ re throw Exception donne une erreur

Lors de l'exécution, je lui donne une exception de format par l'entrée. Je reçois ensuite cette erreur dans une boîte de dialogue: "Une exception non gérée de type 'System.FormatException' s'est produite dans FutureValue.exe Informations supplémentaires: Chaîne d'entrée n'était pas dans un format correct." Lorsque je clique sur 'pause' il me prend à la ligne # 232.

Voici le code partiel:

try 
{ 
... 
} 
catch(FormatException^ ex) 
{ 
     MessageBox::Show("FormatException Occured. Message: " + ex->Message); 
     throw; 
} 
***line# 232*** catch(OverflowException^ ex) 
{ 
     MessageBox::Show("Overflow Occured. Message: " + ex->Message); 
     throw; 
} 
catch(Exception^ ex) 
{ 
     MessageBox::Show("TESTING"); 
} 
+1

Ce n'est pas C++. C++/CLI peut-être? –

+0

J'ai corrigé l'étiquette maintenant. –

Répondre

4

L'expression rethrow (throw sans expression_affectation) provoque le réapplication de l'objet lancé à l'origine. Étant donné que l'exception a déjà été interceptée dans l'étendue dans laquelle l'expression rethrow se produit, elle est renvoyée vers le bloc try suivant dynamiquement suivant. Par conséquent, il ne peut pas être géré par des blocs de capture à la portée dans laquelle l'expression rethrow s'est produite.

Prenant en compte ci-dessus, vous pouvez écrire votre code comme ceci:

try 
{ 
    try 
    { 
     //... 
    } 
    catch(FormatException^ ex) 
    { 
      MessageBox::Show("FormatException Occured. Message: " + ex >Message); 
      throw; 
    } 
    catch(OverflowException^ ex) 
    { 
      MessageBox::Show("Overflow Occured. Message: " + ex->Message); 
      throw; 
    } 
} 
catch(Exception^ ex) 
{ 
     MessageBox::Show("TESTING"); 
} 
+0

Oh, merci. Duh. Pour une raison ou une autre, je pensais que ça continuerait après que ce soit le bloc catch et les blocs de catch après que ça aurait une chance d'attraper l'exception relancée. \t Je vois maintenant qu'une exception relancée, continue après le bloc try lui-même, à tous les blocs try-catch suivants. - –

0

est-il un bloc catch try ci-dessus cela?

Vous venez de lancer une exception avec l'instruction throw, personne ne l'attrape. Le débogueur vous a conduit à l'endroit où l'exception a été déclenchée

+0

Oh, merci. Duh. Pour une raison ou une autre, je pensais que ça continuerait après que ce soit le bloc catch et les blocs de catch après que ça aurait une chance d'attraper l'exception relancée. –

+0

Je vois maintenant qu'une exception relancée, continue après le bloc try lui-même, à tous les blocs try-catch suivants. –

+0

en fait je me trompe totalement. Vous retrouvez devrait avoir été attrapé par le bloc try/catch extérieur (Exception) – pm100