2009-06-09 8 views
0

Ich stieß auf eine Situation, in der ich zurück durch die Methoden der App auf den "Baum" bis ich entschied, es zu fangen (wenn ich es tue) - wie eine Ausnahme ; Es wird durch den ganzen Code angehoben, bis Sie es fangen oder das Dach treffen.Schritt zurück durch Code - wie eine Ausnahme, aber nicht

Der allgemeine Konsens besteht darin, dass Sie nur Ausnahmen für Ausnahmen verwenden. Wenn das der Fall ist, was wäre der Mechanismus, um eine Ausnahme wie ein Muster im Code anzuwenden, aber nicht notwendigerweise eine Ausnahme?

Ist eine Ausnahme der richtige Mechanismus zu verwenden? In diesem Fall tut eine Ausnahme, was benötigt wird - aber durch strenge Definition ist es keine Ausnahme.

Gibt es ein Ereignismuster oder eine Klasse, die mir nicht bekannt ist?

bearbeiten
Nur um zu klären - mein erster Entwurf würde eine benutzerdefinierte Ausnahme zu schaffen - da Ausnahme passt die Rechnung. Aber das ist keine Ausnahme - es ist eine Entscheidung, durch den Code zurückzugehen, bis ich es oder nicht - abhängig. Ich denke, benutzerdefinierte Ausnahme - aber wollen sicherstellen, dass es keine Klasse/Muster, die dies behandelt.

aktualisieren

ich eine benutzerdefinierte Ausnahme endete werfen. Während ich immer dachte, dies sei das beste Muster/die beste Methode zu dem, was ich wollte, mochte ich nicht die Verwendung einer Ausnahme dafür - da es keine Ausnahme ist. Aber letztendlich ist eine Ausnahme die perfekte Lösung.

+0

Bitte posten Sie die Hintergrundgeschichte/Argumentation dafür; Es macht keinen Sinn in der Zusammenfassung –

+0

Ich brauchte eine Möglichkeit, einen benutzerdefinierten Workflow (nicht WF) schnell zu beenden, ohne eine Statusvariable zu überprüfen, um sicherzustellen, dass ich weitermachen sollte oder ob der letzte Schritt erfolgreich war. Eine Ausnahme wird mich den ganzen Weg zurückführen, bis ich es erwische. Es ist, was ich getan habe. –

+0

Sie haben gerade eine Ausnahme missbraucht, um Ihr eigenes GOTO zu erstellen. Das ist hässlich. ;-) –

Antwort

0

Sie könnten Ihre eigene geerbte Ausnahmeklasse ableiten und diese dann werfen, diese spezifische Ausnahme könnte dann auf Ihre eigene Weise behandelt werden.

+0

Das ist meine anfängliche Neigung - aber das ist keine Ausnahme pro sagen. Ich frage mich, ob es noch etwas gibt. –

2

Das Entwurfsmuster Sie suchen eine Fortsetzung genannt wird, in dem Sie einen Punkt der Rückkehr als Wert an andere Funktionen übergeben:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.Start(); 
     } 

     void Start() 
     { 
      Console.WriteLine("Start"); 
      Step1(1); 
      Console.WriteLine("End Start"); 
      Console.ReadKey(true); 
     } 

     void Step1(int state) 
     { 
      Console.WriteLine("Step1: {0}", state); 
      Step2(2,() => { 
       Console.WriteLine("Continuation from step1: {0}", state); 
      }); 
      Console.WriteLine("End Step 1"); 
     } 

     void Step2(int state, Action continuation) 
     { 
      Console.WriteLine("Step2: {0}", state); 
      Step3(3, continuation); 
      Console.WriteLine("End Step 2"); 
     } 

     void Step3(int state, Action continuation) 
     { 
      Console.WriteLine("Step3: {0}", state); 
      continuation(); 
      Console.WriteLine("End Step 3"); 
     } 
    } 
} 

Schritt 3 springt wieder auf 1 durch die Fortsetzung zu treten. Dieses Programm gibt die folgenden:

Start 
Step1: 1 
Step2: 2 
Step3: 3 
Continuation from step1: 1 
End Step3 
End Step2 
End Step 1 
End Start 

Fortsetzung Übertragungsstil ist sehr mächtig, aber es ist nicht ein sehr natürliches Idiom in C#. Verwenden Sie vorsichtig.

0

Je nach Szenario kann die GoF-Musterkette der Verantwortlichkeit Ihren Anforderungen entsprechen. Die Kette der Verantwortlichkeit leitet eine Aufgabe entlang einer Kette von möglichen Behandlern weiter, bis einer die Aufgabe erledigt oder die Kette endet.