2010-08-23 3 views
3

Puis-je détecter à l'exécution à l'intérieur de la méthode Helper() que l'exécution du programme est le résultat d'une exception lancée?Comment détecter si un programme s'exécute sous une exception levée lors de l'exécution?

Notez, mon but est d'éviter d'étendre la méthode Helper() pour prendre un objet exception comme un pararmeter d'entrée.

public void MyFunc1() 
{ 
    try 
    { 
    // some code here that eventaully throws an exception 
    } 
    catch(Exception ex) 
    { 
    Helper(); 
    } 
} 

public void MyFunc2() 
{ 
    Helper(); 
} 

private void Helper() 
{ 
    // how can I check if program execution is the 
    // result of a thrown exception here. 
} 

Répondre

6

Il y a un horrible hack impliquant Marshal.GetExceptionPointers et Marshal.GetExceptionCode qui ne fonctionne pas sur toutes les plates-formes ici est:

public static Boolean IsInException() 
{ 
    return Marshal.GetExceptionPointers() != IntPtr.Zero || 
      Marshal.GetExceptionCode() != 0; 
} 

De cette page: http://www.codewrecks.com/blog/index.php/2008/07/25/detecting-if-finally-block-is-executing-for-an-manhandled-exception/

+2

+1/2 pour la solution folle et +1/2 pour dire son un hack horrible –

+0

Cela ne fonctionne que pour les exceptions qui ont commencé comme une exception Windows SEH. Comme NullReference ou AccessViolation. –

+0

Merci pour la précision Hans. Et merci pour les demi-points Simon. Je pense qu'il y a un autre bidouillage "plus propre" impliquant l'inspection des cadres de la pile, mais j'ai besoin de dormir, je vais essayer une autre fois :-). – jdehaan

3

Je ne peux penser à aucune raison pour laquelle vous ne le faire comme ceci:

private void Helper(bool exceptionWasCaught) 
{ 
    //... 
} 
+0

Dans un monde parfait, je suis d'accord; cependant, mon exemple simplifie ma situation, j'essaie d'éviter de changer la signature de la méthode Helper. – Zamboni

+0

Classe StackFrame: nah. Pas moyen de savoir si une exception est traitée. Variable globale –

+0

Merci, je suis d'accord avec votre réponse, l'idée de ma question m'est venue quand j'avais quelques couches profondes dans le code et je ne voulais pas changer les signatures de la méthode. En fin de compte, j'ai décidé de changer les signatures étant donné les réponses que j'ai obtenues. – Zamboni

2

Pas que je sache. Ceci est lourd, mais il vous définit pleinement l'intention du développeur:

private bool inException = false; 

public void MyFunc1() 
{ 
    try 
    { 
    inException = false; 

    // some code here that eventaully throws an exception 
    } 
    catch(Exception ex) 
    { 
    inException = true; 
    Helper(); 
    } 
} 

public void MyFunc2() 
{ 
    inException = false; 
    Helper(); 
} 

private void Helper() 
{ 
    // how can I check if program execution is the 
    // result of a thrown exception here. 
    if (inException) 
    { 
     // do things. 
    } 
} 
+0

Désolé, mais c'est un très mauvais design et je ne suggèrerais jamais un code comme ça! S'il vous plaît les gens, n'utilisez pas ce code! Prenez la version "Hans Passant" ou mieux passez l'exception au lieu d'un booléen. – Scordo

+0

Dans un monde parfait, je suis d'accord; cependant, mon exemple simplifie ma situation, j'essaie d'éviter de changer la signature de la méthode Helper. - Zamboni 2 mins ago – Puppy

+0

@ Scordo: Je suis sorti de mon chemin pour dire que ce n'était pas génial. Souvent, les gens héritent du code dans lequel les méthodes ne peuvent pas changer leurs signatures facilement comme ça. Je suis d'accord avec Hans, sans aucun doute. Si vous pouvez montrer une solution avec une invasivité minimale aux signatures de méthodes plus propres, merci de contribuer. –

0

Je pense que vous êtes trop réfléchir. Si vous avez une exception, transmettez une exception. Si vous ne le faites pas, ne le faites pas. Pourquoi ne voulez-vous pas changer la signature de la méthode Helper()?

public void MyFunc1() 
{ 
    try 
    { 
    // some code here that eventually throws an exception 
    } 
    catch(Exception ex) 
    { 
    Helper(ex); 
    } 
} 

private void Helper(Exception ex = null) 
{ 
    // result of a thrown exception here. 
    if (ex!=null) 
    { 
     // do things. 
    } else { 
     // do other things 
    } 
} 
Questions connexes