![]() |
AW: Wieso Speicheranforderung in Try...Finally ?
Zitat:
Bis denn Bommel |
AW: Wieso Speicheranforderung in Try...Finally ?
Ich meinte Quellen für den 2. Teil: unerwartete Fehler werden nur bei try-finally behandelt (zumindest habe ich das so rausgelesen).
|
AW: Wieso Speicheranforderung in Try...Finally ?
Ähm, nee, so war das nicht gemeint... Kann man das so lesen? Hmmm... ungeschickt formuliert vielleicht. Streiche das "so auch"...
|
AW: Wieso Speicheranforderung in Try...Finally ?
Dann sehe ich das exakt genau wie Du. :thumb:
|
AW: Wieso Speicheranforderung in Try...Finally ?
Dass try-finally Fehler behandelt ist falsch. try-finally ist ein Ressourcenschutzblock und auch im Fehlerfall belegte Ressourcen wieder frei zu geben. Eine Fehlerbehandlung findet im Except-Block statt.
|
AW: Wieso Speicheranforderung in Try...Finally ?
Sagen wir das nicht die ganze Zeit?
|
AW: Wieso Speicheranforderung in Try...Finally ?
Wir ja, aber stahli in seinem letzten Posting nicht.
Und ein Ressourcenschutzblock macht eine Anwendung in sofern robuster, dass in einem Fehlerfall der Speicher nicht zu läuft. Nehmen wir an man bearbeitet in einer Schleife hunderte von Objekten (Bilder zum Beispiel). Jetzt kommt es bei mehreren Bildern zu Fehlern, warum auch immer. Habe ich jetzt keinen Ressourcenschutzblock, würde der allozierte Speicher nicht mehr freigegeben. Und das kann durch aus zu kritischen Situationen führen. Oder anderes Beispiel: Ich schreibe ein Programm welches Ressourcen benötigt, die nicht immer unbedingt verfügbar sind, weil der Server weggebrochen ist. Da haben wir wieder das gleiche Problem. Nicht immer muss ein Programm unbrauchbar sein, wenn mal eine Ressource nicht zur Verfügung steht. |
AW: Wieso Speicheranforderung in Try...Finally ?
Quizfrage: wird Test freigegeben?
Delphi-Quellcode:
type
TTest = class public procedure DoWork; end; procedure TTest.DoWork; begin raise Exception.Create('Kabumm'); end; procedure TForm1.Button1Click(Sender: TObject); var Test: TTest; begin Test := TTest.Create; try Test.DoWork; except on E: Exception do begin ShowMessage('Irgendeine Fehlerbehandlung'); raise; end; end; Test.Free; end; |
AW: Wieso Speicheranforderung in Try...Finally ?
Nein, wird es nicht, deswegen hatte ich ja auch geschrieben, dass man bei einem re-raise der Exception mit verschachteltem try-except-try-finally arbeiten müsse. Ohne das erneute raise würde es aber freigegeben.
|
AW: Wieso Speicheranforderung in Try...Finally ?
Richtig. Stellen wir uns nun vor, wir haben eine Klasse mit so einer Methode drin (sagen wir ca. 20 LOC). Irgendwann denken wir uns, dass es evtl. ganz gut wäre, die Exception durchzureichen. Gesagt, getan, ein "raise" ans Ende des Except-Blocks und fertig. Schon haben wir uns Platz für ein Speicherleck geschaffen und merken es nicht bzw. können uns nicht erklären, wo es herkommt. Zumindest ich würde nicht als Erstes daran denken, noch einen try-finally-Block drumherum zu schreiben, schließlich war das Leck vorher ja auch nicht da. Und nun erteile ich der anderen Partei das Wort, die finally aus Übersichtlichkeitsgründen weglässt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz