AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Try except - Functions - wie tief
Thema durchsuchen
Ansicht
Themen-Optionen

Try except - Functions - wie tief

Ein Thema von BMI · begonnen am 23. Feb 2015 · letzter Beitrag vom 24. Feb 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#1

Try except - Functions - wie tief

  Alt 23. Feb 2015, 21:06
Ü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
Überarbeitet - weiter unten hier im Thread:

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:
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.
Danke.[/Spoiler]
eine Signatur? - in 2022? - WOZU ?!!!

Geändert von BMI (24. Feb 2015 um 06:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.126 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Try except - Functions - wie tief

  Alt 23. Feb 2015, 21:23
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Try except - Functions - wie tief

  Alt 23. Feb 2015, 21:26
Mit deinem try ... except fängst du die Fehlermeldungen ab un danach gibt es keinen Fehler mehr.

Darum ist das ja auch totaler Humbug.

Delphi-Quellcode:
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
Nach dem ButtonClick kommt eine Dialogbox mit der Fehlermeldung "simulierter Fehler"
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (23. Feb 2015 um 21:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#4

AW: Try except - Functions - wie tief

  Alt 23. Feb 2015, 21:48
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#5

AW: Try except - Functions - wie tief

  Alt 23. Feb 2015, 23:41
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
eine Signatur? - in 2022? - WOZU ?!!!

Geändert von BMI (23. Feb 2015 um 23:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#6

AW: Try except - Functions - wie tief

  Alt 24. Feb 2015, 00:01
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.
Dann darfst du auch nicht soeinen "Mist" bauen, die Exceptions sinnlos abfangen, dafür unpassende und nichtssagende Dialoge anzeigen und die Exceptions nichtmal weiterzureichen.

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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (24. Feb 2015 um 00:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#7

AW: Try except - Functions - wie tief

  Alt 24. Feb 2015, 00:07
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.
Dafür hast du ja die Rückgabewerte der Funktionen, nur auswerten tust du sie im Beispiel nicht. Exceptions rauschen von unten nach oben durch, bis zu der Ebene, wo sie behandelt werden. Werden sie gar nicht (im eigenen Code) behandelt, tut das der allgemeine Exception-Handler von TApplication (?) und sollte der aus irgendwelchen Gründen nicht anschlagen, kommt der vom Betriebssystem zum Tragen. Und dann gibt's noch die Fälle, in denen gar nichts anschlägt, aber die lass ich jetzt unter den Tisch fallen *plumps*.

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.116 Beiträge
 
Delphi 12 Athens
 
#8

AW: Try except - Functions - wie tief

  Alt 24. Feb 2015, 00:14
kommt der vom Betriebssystem zum Tragen
Das stimmt, aber dem sollte man besser keine Exception geben.

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#9

AW: Try except - Functions - wie tief

  Alt 24. Feb 2015, 00:41
Das stimmt, aber dem sollte man besser keine Exception geben.
Jein. Man sollte Exceptions natürlich selbst und möglichst früh behandeln. Aber es gibt Situationen, in denen es gar nicht anders geht, weil irgendeine bekloppte Anwendung die Exception-Handler umgebogen hat, so dass die eigenen gar nicht anspringen, wie ich erst vergangenen Monat mitbekommen und debuggen "durfte".

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.
Und gibt eine entsprechende Meldung darüber ab - immer noch besser als eine ohne Kommentar komplett von selbst im Nirvana verschwindende Anwendung, bei der man die Ursache für den Crash nicht ermitteln kann (siehe oben bzw. verlinktes Thema).

MfG Dalai
  Mit Zitat antworten Zitat
Benutzerbild von BMI
BMI

Registriert seit: 16. Jul 2010
58 Beiträge
 
Delphi 2 Desktop
 
#10

AW: Try except - Functions - wie tief

  Alt 24. Feb 2015, 06:50
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.

Ich habe auch versucht, Eure Ratschläge umzusetzen (soweit ich das verstanden habe - hoffentlich richtig)

Was ich nämlich brauche:
Delphi-Quellcode:
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
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.


Delphi-Quellcode:
 // /////// 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.
Mhh, kann das so ^^ klappen?

Danke.
eine Signatur? - in 2022? - WOZU ?!!!

Geändert von BMI (24. Feb 2015 um 07:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz