2009-03-17 8 views
1

J'essaye d'écrire du code qui attrape une exception particulière et j'en jette une plus utile pour quelque chose de plus haut dans la pile d'appels, mais aussi pour attraper des exceptions plus générales et les gérer.Problème de gestion des exceptions

Le code est quelque chose comme ceci:

try 
{ 
    // Do stuff 
} 
catch (SomeException e) 
{ 
    throw new SomeExceptionWithContextInfo(); 
} 
catch (Exception e) 
{ 
    // Handle unexpected exception gracefully 
} 

Le problème que je vais avoir est que l'exception générale rattrape ma nouvelle exception. est-il un moyen d'éviter cela?

Ma solution actuelle consiste à vérifier le type de l'exception et à la relancer si son type est ce que je viens de créer.

+1

Il s'avère que je ne saisis pas les exceptions correctes afin qu'il fonctionne comme il se doit. –

Répondre

6

Le code que vous avez posté devrait fonctionner, comme le montre cette application test:

using System; 

class OtherException : Exception {} 

class Test 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Foo(); 
     } 
     catch (OtherException) 
     { 
      Console.WriteLine("Caught OtherException"); 
     } 
    } 

    static void Foo() 
    { 
     try 
     { 
      string x = null; 
      int y = x.Length; 
     } 
     catch (NullReferenceException) 
     { 
      throw new OtherException(); 
     } 
     catch (Exception) 
     { 
      Console.WriteLine("Caught plain Exception"); 
     } 
    } 
} 

Cette seulement imprime "Pris OtherException" pas "Caught plain Exception". Êtes-vous sûr de ne pas avoir de bloc try imbriqué dans votre code réel? Pourriez-vous poster un exemple court mais complet qui montre votre problème?

Avez-vous vraiment besoin d'attraper Exception dans votre méthode? C'est très rarement une bonne idée.

+0

C'est vrai, mais il n'y a pas d'essai/catch dans la méthode Main, alors une simple exception sera attrapée, c'est ce qui se passe je suppose. – Groo

+0

S'il n'y a pas try/catch dans la méthode Main, l'application s'interrompra car l'exception ne sera pas du tout gérée. –

+0

Mon mauvais, il s'est avéré que c'était une exception différente –

2

Le code que vous avez posté est la manière de le faire (la capture pour une exception plus spécifique doit apparaître en premier).

Je suggère de regarder à nouveau le code, car soit ils ne sont pas dans cet ordre, soit le code ne jette pas réellement ce type d'exception.

Voici un lien sur msdn à propos de try-catch: http://msdn.microsoft.com/en-us/library/0yd65esw(VS.80).aspx

0

Ne pas attraper des exceptions générales pourrait être la réponse? Découvrez quelles exceptions peuvent être lancées et les attraper séparément.

try { // Outer try/catch 
    DoSomething(); 

    try { 
     /* */ 
    } catch(NotGeneralException e) { 
     /* */ 
    } catch(AnotherNotGeneralException e) { 
     throw new SomeOtherException("Exception message"); 
    } 
} catch(SomeOtherException e) { 
    /* */ 
} 

Alternativement seul hic, une exception générale et réémettre SomeOtherExcepion

try { 

} catch(Exception e) { 
    throw new SomeOtherException("Exception message"); 
} 
+0

Je ne suis pas allé aussi loin pour publier un exemple d'application que Jon, mais attraper le travail comme prévu, pas besoin de solutions de contournement - il y a sûrement autre chose avec ce code – eglasius

2

Vous faites bien. L'exception générale n'attrape pas le spécifique.

Questions connexes