Wir haben viele Fragen darüber gesehen, wann und warum try
/ catch
und try
/ catch
/ verwendet werden sollen finally
. Und ich weiß, dass es definitiv einen Anwendungsfall für try
/ gibt finally
(zumal die using
Anweisung so implementiert wird).
Wir haben auch Fragen zum Overhead von try / catch und Ausnahmen gesehen .
Die Frage, mit der ich verlinkt habe, spricht jedoch nicht über den Aufwand, NUR endlich zu versuchen.
Angenommen, es gibt keine Ausnahmen von allem, was im try
Block passiert , wie hoch ist der Aufwand, um sicherzustellen, dass die finally
Anweisungen beim Verlassen des try
Blocks ausgeführt werden (manchmal durch Rückkehr von der Funktion)?
Wieder frage ich NUR nach try
/ finally
, nein catch
, keine Ausnahmen.
Vielen Dank!
EDIT: Okay, ich werde versuchen, meinen Anwendungsfall ein wenig besser zu zeigen.
Welches soll ich verwenden DoWithTryFinally
oder DoWithoutTryFinally
?
public bool DoWithTryFinally()
{
this.IsBusy = true;
try
{
if (DoLongCheckThatWillNotThrowException())
{
this.DebugLogSuccess();
return true;
}
else
{
this.ErrorLogFailure();
return false;
}
}
finally
{
this.IsBusy = false;
}
}
public bool DoWithoutTryFinally()
{
this.IsBusy = true;
if (DoLongCheckThatWillNotThrowException())
{
this.DebugLogSuccess();
this.IsBusy = false;
return true;
}
else
{
this.ErrorLogFailure();
this.IsBusy = false;
return false;
}
}
Dieser Fall ist zu simpel, weil es nur zwei Rückgabepunkte gibt, aber stellen Sie sich vor, es wären vier ... oder zehn ... oder hundert.
Irgendwann möchte ich try
/ finally
aus folgenden Gründen verwenden:
- Halten Sie sich an die DRY-Prinzipien (insbesondere wenn die Anzahl der Austrittspunkte höher wird).
- Wenn sich herausstellt, dass ich falsch liege, weil meine innere Funktion keine Ausnahme auslöst, möchte ich sicherstellen, dass auf gesetzt
this.Working
istfalse
.
In Anbetracht der Leistungsbedenken, der Wartbarkeit und der DRY-Prinzipien möchte ich hypothetisch für welche Anzahl von Austrittspunkten (insbesondere wenn ich davon ausgehen kann , dass alle inneren Ausnahmen abgefangen werden) eine Leistungsstrafe erleiden, die mit try
/ verbunden ist finally
.
EDIT # 2: Ich habe den Namen von this.Working
in geändert this.IsBusy
. Entschuldigung, ich habe vergessen zu erwähnen, dass dies Multithread ist (obwohl nur ein Thread jemals die Methode aufrufen wird). Andere Threads fragen ab, ob das Objekt seine Arbeit erledigt. Der Rückgabewert ist lediglich Erfolg oder Misserfolg, wenn die Arbeit wie erwartet verlaufen ist.