6 Stimmen

Delphi - Wird der try finally-Block vom Compiler garantiert, dass er korrekt ausgeführt wird?

Ich weiß, dass dies auch in anderen Themen diskutiert wurde, aber was ich frage, ist genau der Titel dieser Frage.

Gibt es einen Fall, bei dem try/finally nicht ausgeführt wird?

try
  // hier tritt ein Fehler auf
finally
  // Code, der ausgeführt werden MUSS
end;

Ich spreche nicht darüber, wie try..except/finally-Blöcke verwendet werden müssen, ich frage nur, ob dies passieren könnte.

LE: Application.Terminate/Stecken Sie Ihren Computer aus sind besondere Fälle.

22voto

Ondrej Kelle Punkte 36511

try..finally garantiert, dass der Code im finally-Block unabhängig davon ausgeführt wird, ob eine Ausnahme im geschützten Block auftritt. Dies gilt natürlich nicht, wenn der Prozess getötet wird, bevor der finally-Block ausgeführt werden kann, z.B. durch TerminateProcess oder Ausschalten des Stroms. Eine Endlosschleife im geschützten Block kann auch verhindern, dass der finally-Block ausgeführt wird.

4voto

Andreas Rejbrand Punkte 100651

Wenn die Stromversorgung unterbrochen wird (zum Beispiel, wenn Sie den Computer ausstecken und er keinen Akku hat und nicht mit einer USV verbunden ist), ist es sehr wahrscheinlich, dass der finally-Block nicht ausgeführt wird. Ein schwerwiegender Betriebssystem- oder Treiberfehler (wie zum Beispiel ein BSOD) könnte dies auch verursachen. Die gesamte Idee mit dem try..finally-Konstrukt ist jedoch, dass der finally-Block ausgeführt wird, selbst wenn eine Ausnahme (jeglicher Art) innerhalb des try-Blocks auftritt. Der finally-Block wird sogar ausgeführt, wenn es eine exit-Anweisung innerhalb des try-Blocks gibt.

3voto

Chris Thornton Punkte 15410

Wenn Ihre App eine DEP (Data Execution Prevention) Ausnahme verursacht, wird Windows Ihnen wahrscheinlich nicht erlauben, fortzufahren. Ihr Prozess wird beendet, ohne den finally-Abschnitt auszuführen. Ihr Prozess verschwindet einfach. Dies hat jedoch nichts damit zu tun, was der Compiler getan oder nicht getan hat.

1voto

David Heffernan Punkte 585606

Sobald der try/finally-Block betreten wird, wird der finally-Block ausgeführt, bevor die Ausführung den try/finally-Block verlässt.

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