2010-02-18 8 views
20

Es wurde bereits eine Frage geschrieben here, die sehr ähnlich ist. Meins erweitert diese Frage ein wenig mehr. Angenommen, Sie möchten mehrere Ausnahmetypen abfangen, aber auf die gleiche Art und Weise behandeln. Gibt es eine Möglichkeit, einen solchen Fall zu umgehen?Versuch- fangen. Mehrere Ausnahmen auf die gleiche Weise behandeln (oder mit einem Fall durch)

switch (case) 
{ 
    case 1: 
    case 2: 

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

} 

Ist es möglich, einige Ausnahmen auf die gleiche Weise zu behandeln. Etwas wie

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

mögliches Duplikat von [Mehrere Exceptions gleichzeitig erfassen?] (Http://stackoverflow.com/questions/136035/catch-multiple-exceptions-at-once) – nawfal

Antwort

15

Derzeit gibt es kein Sprachkonstrukt, um zu erreichen, was Sie wollen. Wenn die Ausnahmen nicht alle von einer Basisausnahme abgeleitet sind, müssen Sie die allgemeine Logik auf eine Methode umstellen und sie von den verschiedenen Ausnahme-Handlern aufrufen.

Alternativ könnte sehen Sie, wie in dieser Frage erklärt:

Catch multiple Exceptions at once?

persönlich neigen dazu, ich die Methode basierten Ansatz bevorzugen.

+2

Um die Daten zu diesem Thread zu kopieren: 'catch (Exception ex) { if (ex ist FormatException || ex ist OverflowException) { WebId = Guid.Empty; Rückkehr; } werfen; } ' –

7

Sie sollten wirklich eine BaseCustomException haben und das fangen.

0

Sie sollten nicht diese vielen benutzerdefinierten Ausnahmen abfangen, aber wenn Sie möchten, können Sie eine gemeinsame BaseException erstellen und fangen.

+0

Warum nicht? Es gibt möglicherweise 3 benutzerdefinierte Bibliotheken im try catch-Block. – Gusdor

+0

Sie haben Recht, im Allgemeinen ist es völlig in Ordnung, so viele benutzerdefinierte Ausnahmen zu fangen, wie Sie brauchen, in der Tat ist es bevorzugt, wenn Sie sie alle anders behandeln. –

-5

Ich habe das oder etwas ähnliches nie gemacht, und ich habe keinen Zugang zu einem Compiler für Testzwecke, aber sicher würde so etwas funktionieren. Ich bin mir nicht sicher, wie man den Typvergleich tatsächlich durchführt oder ob C# die if-Anweisungen durch eine case-Anweisung ersetzt.

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

Dies könnte funktionieren, aber das ist keine gute Lösung, da es zwei sehr grundlegende Fakten ignoriert: a) Es gibt eine Basis-System Exception-Klasse, und Sie müssen nicht bis zu System.Object gehen; und b) mehrere Catch-Anweisungen für verschiedene Ausnahmeklassen existieren für diesen Zweck. –

+0

Ich stimme Allison R zu Punkt (a) zu, aber in Bezug auf Punkt (b) scheint es Kritik an der Beantwortung der gestellten Frage zu sein. – torak

+2

Es ist die elegantere Methode, die allgemeine Funktionalität in eine Methode zu zerlegen und sie in verschiedenen 'catch()' - Blöcken aufzurufen, da sie keine Typprüfung erfordert und die Verwendung von Konstrukten der nativen Sprache für die Ausnahmebehandlung richtig macht. –

1

In vb.net kann man Ausnahmefilter verwenden, um z.

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

Leider für welchen Gründen auch immer, haben die Implementierer von C# noch verweigert Ausnahme Filtercode zu ermöglichen, innerhalb von C# geschrieben werden.

3

Dies ist copied from another posting, aber ich bin ziehen, den Code zu diesem Thema:

Fang System.Exception und Schalter auf den Typen

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

    throw; 
} 

ich diese lieber einen Methodenaufruf in mehrere catch-Blöcke zu wiederholen.

Verwandte Themen