2010-02-18 3 views
20

Il a déjà été question here qui est très similaire. Le mien étend cette question un peu plus. Supposons que vous souhaitiez capturer plusieurs types d'exceptions, mais que vous souhaitiez le gérer de la même manière, y a-t-il un moyen de faire quelque chose comme un commutateur?try-catch. Manipulation de plusieurs exceptions de la même manière (ou avec une chute à travers)

switch (case) 
{ 
    case 1: 
    case 2: 

    DoSomething(); 
    break; 
    case 3: 
    DoSomethingElse() 
    break; 

} 

Est-il possible de gérer quelques exceptions de la même façon. Quelque chose comme

try 
{ 
} 
catch (CustomException ce) 
catch (AnotherCustomException ce) 
{ 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
} 
catch (SomeOtherException ex) 
{ 
//Do Something else 
} 
+0

Copie possible de [Catch multiple Exceptions à la fois?] (Http://stackoverflow.com/questions/136035/catch-multiple-exceptions-at-once) – nawfal

Répondre

15

Actuellement, il n'y a pas de construction de langage pour accomplir ce que vous voulez. À moins que l'exception provienne d'une exception de base, vous devez envisager de refactoriser la logique commune à une méthode et l'appeler à partir des différents gestionnaires d'exceptions.

Sinon, vous pourriez faire comme expliqué dans cette question:

Catch multiple Exceptions at once?

Personnellement, je tendance à préférer l'approche fondée sur la méthode.

+2

Pour copier les données dans ce fil: 'catch (Exception ex) { si (ex est FormatException || ex est OverflowException) { WebId = Guid.Empty; retour; } lancer; } ' –

7

Vous devriez vraiment avoir une exception BaseCustomException et l'attraper.

0

Vous ne devriez pas attraper autant d'exceptions personnalisées, mais si vous le souhaitez, vous pouvez créer un BaseException commun et l'attraper.

+0

Pourquoi pas? Il peut y avoir 3 bibliothèques personnalisées dans le bloc try catch. – Gusdor

+0

vous avez raison, en général il est parfaitement bien d'attraper autant d'exceptions personnalisées que vous avez besoin, en fait son préféré, si vous les manipulez tous différemment. –

-5

Je n'ai jamais réellement fait ceci ou quelque chose comme ça, et je n'ai pas accès à un compilateur à des fins de test mais sûrement quelque chose comme ça fonctionnerait. Vous ne savez pas vraiment comment faire la comparaison de type ou si C# vous permet de remplacer les instructions if par une instruction case.

try 
{ 
} 
catch (System.Object obj) 
{ 
    Type type; 

    type = obj.GetType() ; 
    if (type == CustomException || type == AnotherCustomException) 
    { 
    //basically do the same thing for these 2 kinds of exception 
    LogException(); 
    } 
    else if (type == SomeOtherException ex) 
    { 
    //Do Something else 
    } 
    else 
    { 
    // Wasn't an exception to handle here 
    throw obj; 
    } 
} 
+0

Cela peut fonctionner, mais ce n'est pas une bonne solution, car il ignore deux faits très fondamentaux: a) il existe une classe Exception de système de base, et vous n'avez pas besoin d'aller jusqu'à System.Object; et b) plusieurs instructions catch pour différentes classes d'exception existent à cette fin. –

+0

Je suis d'accord avec Allison R sur le point (a), mais en ce qui concerne le point (b), cela semble être une critique pour avoir répondu à la question qui a été posée. – torak

+2

Décomposer une fonctionnalité commune dans une méthode et l'appeler dans divers blocs 'catch()' est la méthode la plus élégante, car elle ne nécessite pas de vérification de type et utilise correctement les constructions de langage natif pour la gestion des exceptions. –

1

Dans vb.net, on peut utiliser des filtres d'exception pour dire, par ex.

 
    Catch Ex As Exception When TypeOf Ex is ThisException Or TypeOf Ex is ThatException 

Malheureusement, pour une raison quelconque, les implémenteurs de C# ont encore refusé de permettre à un code de filtrage d'exception à écrire dans les C#.

3

C'est copied from another posting, mais je tire le code à ce fil:

Catch System.Exception et passer sur les types

catch (Exception ex)    
{     
    if (ex is FormatException || ex is OverflowException) 
    { 
     WebId = Guid.Empty; 
     return; 
    } 

    throw; 
} 

Je préfère cela à répéter un appel de méthode dans plusieurs blocs catch.

Questions connexes