2017-06-21 7 views
1

EXEMPLE - A() -> B() -> C()Est-il possible de forcer un try-catch même si les exceptions sont traitées plus haut dans la pile d'appels?

C() contient un try-catch, et les journaux simplement l'exception et continue avec l'exécution, parce que le throw; a été commentée.

Par conséquent, le try/catch dans A() ne se déclenchera pas.

public void A(){ 
    try{ 
     B(); 
    } 
    catch(Exception e){ 
     //something really important 
    } 
} 


public void B(){ 
    try{ 
     throw new Exception("test"); 
    } 
    catch(Exception e){ 
     Log.Error($"Error - {e.InnerException}"); 
     //throw; 
    } 

    //further code 
} 

est-il un mécanisme qui oblige A() prises pour capturer une exception soulevée dans l'appel pile le suivant?

La raison pour laquelle je demande est que je dois m'assurer que tous les problèmes avec un paiement sont signalés mais il doit y avoir plus de 40 tentatives d'essai dans les masses de code que B(); contient!

+1

Aucune exception n'est levée à ce point de la pile, il n'y a donc rien à attraper. Le moyen de "forcer" un 'catch' est de lancer une exception. – David

+1

Pourquoi 'throw' est commenté? BTW, vous pouvez utiliser C# 7.0 [filtres d'exception] (https://stackoverflow.com/a/4268291/1997232) pour enregistrer quelque chose. – Sinatr

+0

@David l'exception est lancée dans l'essai de la méthode B, et est interceptée dans la méthode B, donc je comprends car elle n'a pas été relancée A n'est pas au courant mais je me demandais si un mécanisme existe pour le faire. –

Répondre

3

Non, vous ne pouvez pas attraper une exception déjà traité à moins que cette exception est relancée:

try 
{ 
    B(); 
} 
catch(Exception e) 
{ 
    // handle the exception 

    throw; // then re-throw it. 
} 

Si elle est à des fins d'exploitation forestière, vous cherchez peut-être l'événement AppDomain.FirstChanceException, ce qui vous donne la possibilité de 'attraper' des exceptions même lorsqu'elles sont gérées.

+1

'AppDomain.FirstChanceException' est le bon point ici – Rahul

+0

Merci, c'est à des fins de journalisation qui est essentiellement je ne veux pas essayer de trouver chaque exception dans les chemins d'exécution de code potentiel. Je suis content que vous ayez signalé cet événement parce qu'il ressemble exactement à ce que je recherchais. –

1

Non

Il n'y en a pas. Vous devrez faire confiance à B() pour faire son travail et rapporter avec précision les résultats.

Il n'y a pas de protection B() étant ce soit:

public bool B() 
{ 
    var failed = ImportantOperation(); 

    if(failed) 
     // oops 
     return true; 
    else 
     return true; 
} 

Si vous ne faites pas confiance du code, écrire vous-même ou obtenir un fournisseur de code que vous pouvez faire confiance.