![]() |
Try except - Functions - wie tief
ÜBERARBEITET und daher komplett anderer Zusammenhang, aber ich lasse hier alles stehen, um die Quotes stimmig zu halten.
Ich bitte Euch, wegen dem Code den Beitrag 10 unten anzuschauen ![]() Bitte Hier klicken ! http://www.delphipraxis.net/184074-try-except-functions-wie-tief.html#post1291202 [Spoiler]Hi, ich hab jetzt herumgewurschtelt, aber so richtig sicher bin ich mir nicht: Wie tief kann man functions mit Try verschachteln? Ich würde gerne eine "erste" Function aufrufen, die eine zweite aufruft, in der eine systemkritische Operation durchgeführt wird. Allerdings soll bis zur Button-Procedure die Rückmeldung über Erfolg/Fail zurückgeleitet werden. Quasi irgendwo ein Result aus der zuvor abgearbeiteten Funktion. Gesehen hab ich das schon mal. Aber ich kann es gerade nicht implementieren. Momentan poppt aber lediglich die Fehlermeldung in Funktion zwei [also hier im Code ganz oben] auf, danach die ExceptShowmessage in Function zwei und das Programm bricht ab. Mehr passiert nicht.
Delphi-Quellcode:
Danke.[/Spoiler]
implementation
{$R *.DFM} function DieZweiteFUNC(A_egal: string): boolean; var zweite: Integer; begin Form1.Top := 0; try begin zweite := 8 div Form1.Top; // irgendein Wert durch -> NULL 0, damit es abbricht ShowMessage(inttostr(zweite)); end except ShowMessage('zweite KLAPPT NIX'); end; end; function checkit(Bla: string; Blubb: string): boolean; var erste: integer; begin try begin DieZweiteFUNC('rufe zweite'); end except ShowMessage('JA NÖÖÖÖÖÖÖ erste nich'); end; end; // END FUNCTION procedure TForm1.Button1Click(Sender: TObject); var SOURCE: integer; begin try begin checkit('A', 'C'); end except ShowMessage('JA NÖÖÖÖÖÖÖ Hat nicht funktioniert.'); end; end; // END FUNC end. |
AW: Try except - Functions - wie tief
Abgesehen davon, das try except kein begin end braucht...
Ein except fängt die Exception ab... Dann läuft das Programm weiter (nur in der IDE kommt die Exception durch) Also Variable setzen oder mit einem Raise wieder eine exception auslösen... Mavarik |
AW: Try except - Functions - wie tief
Mit deinem
Delphi-Quellcode:
fängst du die Fehlermeldungen ab un danach gibt es keinen Fehler mehr.
try ... except
Darum ist das ja auch totaler Humbug.
Delphi-Quellcode:
Nach dem ButtonClick kommt eine Dialogbox mit der Fehlermeldung "simulierter Fehler"
implementation
{$R *.DFM} function DieZweiteFUNC(A_egal: string): boolean; begin raise Exception.Create( 'simulierter Fehler' ); ShowMessage( A_egal ); // wird nicht ausgeführt end; function checkit(Bla: string; Blubb: string): boolean; begin DieZweiteFUNC('rufe zweite'); ShowMessage( Bla + Blubb ); // wird nicht ausgeführt end; // END FUNCTION procedure TForm1.Button1Click(Sender: TObject); begin checkit('A', 'C'); ShowMessage( 'Alles schick' ); // wird nicht ausgeführt end; // END FUNC |
AW: Try except - Functions - wie tief
Wenn man Exceptions falsch behandelt, dann soll man sich nicht wundern.
Vorallem nicht mit MessageBoxen. Exteptions rauschen immer bis dahin durch, wo sie abgefangen und nicht erneut ausgelöst werden. Und zum Probieren braucht man keine Funktionen.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var SOURCE, erste, zweite: Integer; begin try try Self.Top := 0; try //zweite := 8 div Self.Top; // irgendein Wert durch -> NULL 0, damit es abbricht raise EDivByZero.Create('*peng*'); ShowMessage('Test'); except ShowMessage('zweite KLAPPT NIX'); raise; end; except on E: Exception do begin //ShowMessage('JA NÖÖÖÖÖÖÖ erste nich'); E.Message := 'JA NÖÖÖÖÖÖÖ erste nich' + sLineBreak + E.Message; raise; end; end; except on E: Exception do begin //ShowMessage('JA NÖÖÖÖÖÖÖ Hat nicht funktioniert.'); ShowMessage('JA NÖÖÖÖÖÖÖ Hat nicht funktioniert.' + sLineBreak + E.Message); end; end; end; |
AW: Try except - Functions - wie tief
Wahh ;D
nee, ich will doch gar nich ohne Excep, äh, alles in einem Button unterbringen. Hab mich vielleicht nur falsch ausgedrückt, weil ich nich so firn bin in Delphi (und das gerade ganz herb bereue, ... ehrlich ..) Ich habe verschiedene, unabhängige Funktionen - und diese möchte ich aus verschiedenen Prozeduren und anderen Funktionen heraus aufrufen können, möchte aber über den Erfolg informiert werden. d.h. wenn die ProgrammBefehle in der zweiten Function aufgrund eines Fehlers nicht ausgeführt werden können, soll eben eine Rückmeldung bis in die Buttonprozedur erfolgen. In function 1 und 2 erfolgen natürlich noch andere Befehle, als nur das Dividieren, Message-Ausgeben und Aufrufen anderer "Sub-Funktionen". Ich möchte nur sicherstellen, daß die ganze Kaskade abgerbrochen wird und auch in der Buttonprocedure dann danach nicht munter weitergearbeitet wird, wenn in Function 2 oder 1 etwas fehlschlägt. function1 bereitet Daten evtl. auf/vor, function2 führt Dateioperationen durch. So in der Art. Hoffe, das wird klarer. Ich hatte die Funjtionen oben ja nur wegen der Übersichtlichkeit ihrer weiteren Befehle bereaubt. Danke aber schon mal. LG |
AW: Try except - Functions - wie tief
Zitat:
Und das mit dem zusammengefassten Code, bezog sich nur auf's Testen und das Rumspielen mit den Exceptions. Denn so ist alles zusammen und man sieht auch viel besser, wie wo die Bearbeitung lang geht. also siehe Sir Rufo und hier sein code zusammengefasst
Delphi-Quellcode:
raise Exception.Create( 'simulierter Fehler' );
ShowMessage( A_egal ); // wird nicht ausgeführt ShowMessage( Bla + Blubb ); // wird nicht ausgeführt ShowMessage( 'Alles schick' ); // wird nicht ausgeführt |
AW: Try except - Functions - wie tief
Zitat:
Ach, übrigens sollte man Exceptions nicht zur Code-Steuerung benutzen. Exceptions sind Ausnahmen/Ausnahmesituationen, in denen etwas (ganz) schlimm fehlschlägt, und sollten als solche auch behandelt werden. Das nur zu "Vorbeugung", bevor du auf derartige Ideen kommst. MfG Dalai |
AW: Try except - Functions - wie tief
Zitat:
Was dann passiert, sieht man an Konolenanwendungen und an vielen Nicht-RTL-Threads (ohne TThread). Denn Windows reagiert da sehr nett und schießt die komplette Anwendung ab. Darum hat auch TThread.Execute nochmal ein Try-Except drumrum, wobei diese Exceptions leider nicht automatisch angezeigt werden. Und auch die neuen Konsolenanwendungen in aktuelleren Delphis haben in der Codevorlage (der DPR) nun endlich ein Try-Except mit drin. |
AW: Try except - Functions - wie tief
Zitat:
![]() Zitat:
MfG Dalai |
AW: Try except - Functions - wie tief
Hier neu:
Also ich möchte nochmal fragen, weil ich nicht im ersten Thread den Code verändfern wollte, da sonst die Quotes nicht mehr stimmig sind = ich hoffe, das ist eine gute Entscheidung.:pale: Ich habe auch versucht, Eure Ratschläge umzusetzen (soweit ich das verstanden habe - hoffentlich richtig) Was ich nämlich brauche:
Delphi-Quellcode:
Die function BewegeDatei soll also so oder so aufgerufen werden [sie enthält u.A. moveFile() bzw. moveFileEx()=^Überschreiben, was je nach gesetzter Checkbox ausgeführt wird - entweder kann sie direkt sufgerufen werden (Datei existiert nicht) oder es wird erst in der Funktion Umbenennen_vorbereiten ein Dialog erstellt und abgefragt und von dort die Funktion BewegeDatei aufgerufen.
Function Umbenennen_vorbereiten()
begin BewegeDatei(Move/Überschreiben()) end; Button.click() begin if FileExists(neuerOrt) then Umbenennen_vorbereiten() // über Umweg mit AuswahlDialog else BewegeDatei() // direkt end
Delphi-Quellcode:
Mhh, kann das so ^^ klappen?
// /////// ACHTUNG: GEÄNDERTE, aktuelle, reale FUNCTION NAMEN !
implementation {$R *.DFM} function BewegeDatei(Ort_A: string; Ort_B): boolean; // ehemals "Zweite Function" begin try // wohl das einzige, try, was bleiben darf ?!! moveFile(Ort_A, Ort_B) // ShowMessage('Verschieben klappt'); except ShowMessage('Meldung aus zweiterFunc: Verschieben klappt irgendwie nicht'); end; end; // End Function BEWEGEN function Umbenennen_vorbereiten(Bla: string; Blubb: string): boolean; // ehemals "erste Funcition" var erste: integer; begin // try ExtensionExtrahieren(OrtB); NeuerDateiName := OrtB + inc(Zahl) + Extension; // Namensfindung abgekürzt! if NOT BewegeDatei(OrtA, NeuerDateiName ) then // except ShowMessage('Hier gibt s ein echtes Problem: Datei läßt sich nicht bewegen.'); end; end; // END FUNCTION Umbenennen procedure TForm1.Button1Click(Sender: TObject); ///////// BUTTON var SOURCE: integer; begin //try if Bewege('C:\Datenlager.txt', ''E:\Datenlager.txt'') then Dateiliste.delete(MaximalwertDerListe-1) //als erledigt von Liste streichen else // except hier gibt es dann ein Problem // ehemals: ShowMessage('Es hat gar nix funktioniert'); end; end; // END BUTTON end. Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:49 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 by Thomas Breitkreuz