2017-07-11 2 views
0

Wie Kontrollfluss (If-else Struktur) kann für Try-Catch verwendet werden, ich meine, wie kann das Programm für Aufgabe A versuchen und wenn es eine Ausnahme dann werfen gehen für Aufgabe B. ein Weg ist, verschachtelte try-catch wie dieseHinzufügen der Kontrollfluss-Struktur zum Ausnahme-Manager in C#?

try{ 
    .... 
    } catch(exception ex1) 
    try{ 
    .... 
    } catch(exception ex2) { 
     try{ 
      } 
    .... 

Aber diese Struktur ist nicht skalierbar, was ist, wenn es benötigt wird, für wie 100 Situation zu überprüfen, Sollen wir 100 verschachtelten try Beifänge schreiben?

+0

Sie nehmen sollten ein Blick auf [wie man fragt] (https://stackoverflow.com/help/how-to-ask) und lesen Sie die Dokumentation auf versuchen, um zu sehen, wie es funktioniert – Fabulous

+0

zugegebenermaßen ist die Frage, die ich gestellt habe, sehr schlecht ist. Ich fand eine Minute später selbst eine Lösung. Es ist jetzt nicht löschbar. – MimSaad

Antwort

1

Sie zu dieser 100-mal müssen gegeben und haben Ausnahme für Ihre Steuerfluss zu verwenden (was, wenn vermieden werden soll möglich). Sie könnten einige Wrapper wie folgt verwenden:

public class ExWrapper 
{ 
    private readonly Action _action; 
    private readonly ExWrapper _prev; 

    private ExWrapper(Action action, ExWrapper prev = null) 
    { 
     _action = action; 
     _prev = prev; 
    } 

    public static ExWrapper First(Action test) 
    { 
     return new ExWrapper(test); 
    } 

    public ExWrapper Then(Action test) 
    { 
     return new ExWrapper(test, this); 
    } 

    public void Execute() 
    { 
     if (_prev != null) 
      try 
      { 
       _prev.Execute(); 
      } 
      catch (Exception) 
      { 
       _action(); 
      } 
     else 
      _action(); 
    } 
} 

So können Sie Ketten Aktionen, wo die nächste Aktion nur dann, wenn der erste wirft ausgeführt wird. Sie können es wie im folgenden Beispiel verwenden:

ExWrapper.First(() => { Console.WriteLine("First"); throw new Exception(); }) 
     .Then(() => { Console.WriteLine("Second"); throw new Exception(); }) 
     .Then(() => { Console.WriteLine("Third"); throw new Exception(); }) 
     .Then(() => { Console.WriteLine("Fourth"); }) 
     .Execute(); 

Diese alle Aktionen oder Lambda-Ausdrücke in der angegebenen Reihenfolge ausgeführt wird, sondern nur die folgende Aktion ausführen, wenn der erste wirft. Das obige Beispiel druckt:

First 
Second 
Third 
Fourth 

Wenn Sie die throws im Beispiel entfernen:

ExWrapper.First(() => { Console.WriteLine("First"); }) 
     .Then(() => { Console.WriteLine("Second"); }) 
     .Then(() => { Console.WriteLine("Third"); }) 
     .Then(() => { Console.WriteLine("Fourth"); }) 
     .Execute(); 

Nur die erste Aktion ausgeführt wird, was in der folgenden Ausgabe:

First 
2

Sie sind frei zu versuchen/fangen mehrere Ebenen tief, wenn Sie möchten.

try 
{ 
    operation1(); 
} 
catch (Exception e) 
{ 
    try 
    { 
    operation2(); 
    } 
    catch (Exception e2) 
    { 
     // etc 
    } 
} 
+1

Bitte erklären Sie, warum es eine schlechte Frage ist, bin ich neugierig. Ich wusste nicht, dass du keine Fragen für absolute Anfänger stellen darfst. – killexe

+0

Ich hoffe, er wurde nicht zur Beantwortung abgelehnt. Es ist die richtige Antwort. –

+0

@killexe solche Anfänger Fragen werden viel schneller nur durch das Lesen der Dokumentation der Sprache beantwortet. Daher gibt der Downvote "diese Frage ** keine ** Forschungsanstrengungen" wieder. –

1

Schreiben Sie einfach einen anderen try-Block in den Catch-Block.

try { 
    //task A 
} catch(Exception ex) { 
    try { 
    //task B 
    } 
} 
0

Verschachtelte try-catch viele Ressourcen verwenden, und wenn sie aus der Hand können sie erheblich die Leistung des Programms reduzieren. Wie auch immer, können Sie nacheinander catch-Blöcke hinzufügen:

try 
{ 
    //code here 
}catch(SomeException ex) 
{ 
    //Display what the specific exception was 
}catch(SomeOtherException ex) 
{ 
    //Display what the specific exception was 
} 
+0

"Signifikant reduzieren"? Verwenden Sie eine 100 MHz CPU? .NET kann problemlos Hunderte von Ausnahmen werfen/fangen. Wenn Sie mir nicht glauben, werfen Sie eine unbehandelte Ausnahme auf eine verschachtelte Aufgabe –

+0

Hängt davon ab, wie groß Ihr Programm ist. Einige meiner eigenen Projekte können 1000-2000 Codezeilen in einem Versuch enthalten, indem sie in die Art und Weise verschachtelt werden, wie Jesse Carter oder killexe mit einer "signifikanten Menge" die Leistung reduzieren würden. –

+0

Wenn Sie mehr als 20 Zeilen in einem Versuch Block haben, dann ist Ihr Code höchstwahrscheinlich schlecht, geschweige denn über tausend Zeilen –

1

Eine andere Möglichkeit wäre, um Ihre Aufgaben zu Methoden zu bewegen, die einen bool zeigt Erfolg zurückkehren, und dann haben Sie nicht zu nisten Ihre try/Fänge:

public static bool TrySomething(string someInput) 
{ 
    bool result = true; 

    try 
    { 
     // do something with someInput 
    } 
    catch 
    { 
     result = false; 
    } 

    return result; 
} 

public static bool TrySomethingElse(string someInput) 
{ 
    bool result = true; 

    try 
    { 
     // do something with someInput 
    } 
    catch 
    { 
     result = false; 
    } 

    return result; 
} 

Dann in Ihrem Haupt-Code, könnten Sie tun:

string data = "some data"; 

if (!TrySomething(data)) 
{ 
    TrySomethingElse(data); 
} 
+0

Das ist auch eine gute Idee, ich wünschte, ich könnte zwei Antworten akzeptieren! – MimSaad

Verwandte Themen