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
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
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.
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!
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.");
}
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);
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.