8 Stimmen

Beispiel für die "Verwendung von Ausnahmen zur Steuerung des Flusses"

Wie würde ein Codestück aussehen, das "Ausnahmen für den Kontrollfluss verwendet"? Ich habe versucht, ein direktes C#-Beispiel zu finden, kann es aber nicht. Warum ist das schlecht?

Danke

14voto

Eric Olsson Punkte 4697

Per Definition ist eine Ausnahme ein Ereignis, das außerhalb des normalen Ablaufs Ihrer Software auftritt. Ein schnelles Beispiel, das mir gerade einfällt, ist die Verwendung einer FileNotFoundException um zu sehen, ob eine Datei existiert oder nicht.

try
{
    File.Open(@"c:\some nonexistent file.not here");
}
catch(FileNotFoundException)
{
    // do whatever logic is needed to create the file.
    ...
}
// proceed with the rest of your program.

In diesem Fall haben Sie nicht die File.Exists() Methode, die das gleiche Ergebnis erzielt, aber ohne den Overhead der Ausnahme.

Abgesehen von der schlechten Nutzung gibt es einen Overhead, der mit einer Ausnahme, dem Auffüllen der Eigenschaften, dem Erstellen des Stack Trace usw. verbunden ist.

11voto

Kieren Johnstone Punkte 40059

Er entspricht in etwa einem goto, ist aber schlechter in Bezug auf die Wortausnahme und hat mehr Overhead. Sie weisen den Code an, zum Catch-Block zu springen:

bool worked;
try
{
    foreach (Item someItem in SomeItems)
    {
        if (someItem.SomeTestFailed()) throw new TestFailedException();
    }
    worked = true;
}
catch(TestFailedException testFailedEx)
{
    worked = false;
}
if (worked) // ... logic continues

Wie Sie sehen können, werden einige (erfundene) Tests durchgeführt; wenn sie fehlschlagen, wird eine Ausnahme ausgelöst, und worked wird eingestellt auf false .

Es ist viel einfacher, einfach die bool worked direkt, natürlich!

Ich hoffe, das hilft!

10voto

Dan Tao Punkte 121990

Schlecht

Der folgende Code fängt eine Ausnahme ab, die leicht vermieden werden könnte. Dies erschwert die Nachvollziehbarkeit des Codes und hat in der Regel auch Leistungseinbußen zur Folge.

int input1 = GetInput1();
int input2 = GetInput2();

try
{
    int result = input1 / input2;
    Output("{0} / {1} = {2}", input1, input2, result);
}
catch (OverflowException)
{
    Output("There was an overflow exception. Make sure input2 is not zero.");
}

Besser

Dieser Code prüft auf eine Bedingung, die würde eine Ausnahme auslösen, und korrigiert die Situation, bevor der Fehler auftritt. Auf diese Weise gibt es überhaupt keine Ausnahme. Der Code ist besser lesbar, und die Leistung ist sehr wahrscheinlich um besser zu sein.

int input1 = GetInput1();
int input2 = GetInput2();

while (input2 == 0)
{
    Output("input2 must not be zero. Enter a new value.");
    input2 = GetInput2();
}

int result = input1 / input2;
Output("{0} / {1} = {2}", input1, input2, result);

5voto

Toby Punkte 7124

Hier ist ein gängiges Beispiel:

public bool TryParseEnum<T>(string value, out T result)
{
    result = default(T);

    try
    {
        result = (T)Enum.Parse(typeof(T), value, true);
        return true;
    }
    catch
    {
        return false;
    }
}

2voto

Tesserex Punkte 16756

Das ist wahrscheinlich der schlimmste Verstoß, den ich je gesehen habe:

// I haz an array...
public int ArrayCount(object[] array)
{
    int count = 0;
    try
    {
        while (true)
        {
            var temp = array[count];
            count++;
        }
    }
    catch (IndexOutOfRangeException)
    {
        return count;
    }
}

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