4 Stimmen

Ausnahmen für den Kontrollfluss

Es gibt ein interessanter Beitrag hier in Bezug auf den anwendungsübergreifenden Kontrollfluss.

Nun, vor kurzem bin ich auf ein interessantes Problem gestoßen. Die Generierung des n-ten Wertes in einer potenziell (praktisch) endlosen rekursiven Folge. Dieser spezielle Algorithmus wird an dem Punkt, an dem er erfolgreich ist, mindestens 10-15 Stapelverweise tief sein. Mein erster Gedanke war, eine SuccessException auszulösen, die etwa so aussieht (C#):

class SuccessException : Exception
{
    public string Value
    { get; set; }

    public SuccessException(string value)
        : base()
    {
        Value = value;
    }
}

Dann machen Sie etwas Ähnliches:

try
{
    Walk_r(tree);
}
catch (SuccessException ex)
{
    result = ex.Value;
}

Dann wanderten meine Gedanken wieder hierher, wo ich immer wieder gehört habe, dass man niemals Ausnahmen für die Flusskontrolle verwenden soll. Gibt es jemals eine Ausrede? Und wie würden Sie so etwas strukturieren, wenn Sie es einführen würden?

0voto

TK. Punkte 44387

Das Problem bei der Verwendung von Ausnahmen ist, dass sie (im Großen und Ganzen) sehr ineffizient und langsam sind. Es wäre sicherlich genauso einfach, eine Wenn-Bedingung innerhalb der rekursiven Funktion zu haben, um nur bei Bedarf zurückzukehren. Um ehrlich zu sein, ist es bei der Speicherkapazität moderner PCs unwahrscheinlich (aber nicht unmöglich), dass es bei einer geringen Anzahl von rekursiven Aufrufen (<100) zu einem Stapelüberlauf kommt.

Wenn der Stapel ein echtes Problem darstellt, könnte es notwendig werden, "kreativ" zu sein und eine "tiefenbegrenzte Suchstrategie" zu implementieren, die es der Funktion ermöglicht, aus der Rekursion zurückzukehren und die Suche am letzten (tiefsten) Knoten neu zu beginnen.

Zusammengefasst: Ausnahmen sollten nur in Ausnahmefällen verwendet werden, der Erfolg eines Funktionsaufrufs zählt meiner Meinung nach nicht dazu.

0voto

Quibblesome Punkte 24734

Die Verwendung von Ausnahmen im normalen Programmablauf ist in meinen Augen eine der schlechtesten Praktiken überhaupt. Denken Sie an den armen Trottel, der nach verschluckten Ausnahmen jagt und einen Debugger laufen lässt, der so eingestellt ist, dass er anhält, sobald eine Ausnahme auftritt. Dieser Kerl wird jetzt verrückt.... und hat eine Axt :P

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X