![]() |
Absturz trotz try/finally
Ich bin kurz vor dem Verzweifeln. Was ist bei einem VCL-Programm anders als bei einem nonVCL/Konsolenprogramm? Ich habe hier in etwa folgenden Code:
Delphi-Quellcode:
Es ist nur Pseudo-Code, sorry. Aber grundlegend sieht er so aus.
rs := Interface.Create;
if(rs <> nil) then try try rs.Connect; except rs := nil; end; if(rs <> nil) then try filter := rs.GetFilterInterface; if(filter <> nil) then try filter.Create('Filter',''); except // do nothing end; finally rs.CloseConnection; end; finally rs := nil; end; Wenn ich den Code jetzt in einem VCL-Programm starte (besser gesagt: wenn ich das kompilierte VCL-Programm starte), dann legt er den Filter mit dem leeren Inhalt an, schließt die Verbindung, und fertig. Mache ich das jetzt in einen nonVCL/Konsolenprogramm, dann erhalte ich eine Zugriffsverletzung, und die Verbindung wird nicht richtig geschlossen. Trotzdem wird der Filter angelegt, nur dass (im Gegensatz zum VCL-Programm) diese Zugriffsverletzung erscheint. Ist der Filter nicht leer, also
Delphi-Quellcode:
dann geht es auf einmal.
filter.Create('Filter','Testinhalt');
Kennt jemand den Grund dafür? Ich muss zugeben, ich habe keine Ahnung. :( |
Re: Absturz trotz try/finally
Jupp.
Die VCL hat ein eigenes Exception-Handling, und sauber abgefangene Exceptions werden nicht durchgereicht. Bei nonVCL fehlt das ganze Zeugs (ist irgendwo in Application drin). |
Re: Absturz trotz try/finally
Die "SysUtils.pas" hat gereicht. ;) Aber dennoch, ein guter Tipp. Jetzt die obligatorische Frage: Wie kann ich auf die SysUtils-Unit verzichten (um das Programm klein zu halten) und trotzdem die genannte Exception abfangen ... bzw. abgefangen wird sie ja eigentlich schon, nur löst sie eben noch die Meldung aus.
Ein bisschen Lektüre zum Thema täte es auch schon. |
Re: Absturz trotz try/finally
@MathiasSimmack: Kopier' dir die entsprechenden Teile aus der Sysutils.pas und füge sie bei dir ein.
Ratte |
Re: Absturz trotz try/finally
mit try finally unterdrückst du keine exceptions.
es wird nur zusaetzlich der finally block ausgefuehrt. nach dem block wird die exception behandelt. d.h. der code wird abgebrochen und in den exceptionhandler der appliction gesprungen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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