Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Aufrufende Prozedur verlassen (https://www.delphipraxis.net/70301-aufrufende-prozedur-verlassen.html)

fkerber 28. Mai 2006 12:35


Aufrufende Prozedur verlassen
 
Hi!

Ich hätte da mal eine Frage (wer hätt's gedacht)...


Ich habe mir eine Prozedur "Error" geschrieben:
Delphi-Quellcode:
procedure Error(msg: String);
begin
  MessageDlg(msg,mterror,[mbOk],0);
end;
Die wird immer dann aufgerufen, wenn ein schwerwiegender Fehler aufgetreten ist, sodass die Prozedur verlassen werden soll, in der der Fehler auftrat.

Momentan sieht das dann bspw. so aus:

Delphi-Quellcode:
 if not IsSthSelected(Listbox1) then
  begin
    Error('Sie müssen das Bild mindestens einem Gebäude zuordnen');
    exit;
  end;
Bedeutend schöner fände ich es jetzt allerdings, wenn die Error-Prozedur auch dieses Exit gleich mit veranlassen könnte. Geht das irgendwie?


Ciao Frederic

Dax 28. Mai 2006 12:37

Re: Aufrufende Prozedur verlassen
 
Nun ja.... Nein. Dazu müsste Error() die Stackgröße des Aufrufers kennen, den Stack bis zur Rücksprungadresse abräumen und dann erst zum Ende kommen. Geht bestimmt irgendwie, aber bestimmt nicht einfach^^

fkerber 28. Mai 2006 12:38

Re: Aufrufende Prozedur verlassen
 
Hi!

Hmm, das klingt wie eine "zu-Fuß-Lösung" ;)
Wenn es nur eine solche gibt, bleibt es wie es ist. Ich dachte mir schon, dass es da nichts "schönes" gibt, aber ich wollt dann doch mal fragen.


Ciao Frederic

Olli 28. Mai 2006 12:39

Re: Aufrufende Prozedur verlassen
 
Sowas erreichst du nur mit Exceptions, wenn du sie zu einem "höheren" Exception-Handler durchschlagen läßt. Ansonsten wüßte ich nicht, wie sich das in Delphi realisieren ...

mkinzler 28. Mai 2006 12:42

Re: Aufrufende Prozedur verlassen
 
Wäre IMHO auch nicht sinnvoll, da ja die Ablauflogik/Programmfluß unterbrochen wäre.

fkerber 28. Mai 2006 12:43

Re: Aufrufende Prozedur verlassen
 
Hi!

Gut, dann habt ihr mich überzeugt :wink:
Wie gesagt, ich dachte es mir, aber sicher ist sicher...


Ciao Frederic

Olli 28. Mai 2006 12:44

Re: Aufrufende Prozedur verlassen
 
Zitat:

Zitat von mkinzler
Wäre IMHO auch nicht sinnvoll, da ja die Ablauflogik/Programmfluß unterbrochen wäre.

Meinst du Exceptions? Im Gegenteil, es gibt viele Leute die es für den saubereren Programmierstil halten den Exceptionhandler irgendwo weit "oben" anzusiedeln und Exceptions durchschlagen zu lassen. So behandelt man die Exceptions nämlich nur an wenigen ausgewählten Stellen statt überall im Code verstreut.

mkinzler 28. Mai 2006 12:48

Re: Aufrufende Prozedur verlassen
 
Nein, die Tatsache, eine Prozedur/Funktion von einer aufgerufenden Prozedur/Funktion mitbeenden zu lassen.

jfheins 28. Mai 2006 12:50

Re: Aufrufende Prozedur verlassen
 
Wieso? Oft lass ich Exceptions auch bis ganz oben durchkommen, damait dann einfach eine Fehlermeldung kommt.

Wenn eine Vorrausetzung nicht gegeben ist - warum solltest du mit der Prozedur weitermachen ?

Olli 28. Mai 2006 12:52

Re: Aufrufende Prozedur verlassen
 
Zitat:

Zitat von mkinzler
Nein, die Tatsache, eine Prozedur/Funktion von einer aufgerufenden Prozedur/Funktion mitbeenden zu lassen.

Das stimmt.

Aber mancher findet halt die C-Variante ganz gut, wo die Funktion Error() ja zumindest einen Rückgabewert haben könnte. Wodurch man dann in der selben Zeile mit einem "return Error(...)" die aufrufende Funktion verlassen kann :mrgreen:

Ich persönlich stricke meinen Code in C immernoch lieber mit verschachtelten IFs statt mit kurzen IF-NOTs und return.

Zitat:

Zitat von jfheins
Wenn eine Vorrausetzung nicht gegeben ist - warum solltest du mit der Prozedur weitermachen ?

Ein ...
Delphi-Quellcode:
function bla():TDingens;
begin
  if IsSthSelected(Listbox1) then
  begin
    // ... mach was
  end
  else
  begin
    Error('Sie müssen das Bild mindestens einem Gebäude zuordnen');
  end;
end;
täte es aber auch :-D ... oder noch "eleganter" (?):
Delphi-Quellcode:
function bla():TDingens;
begin
  if IsSthSelected(Listbox1) then
  begin
    // ... mach was
  end
  else
    Error('Sie müssen das Bild mindestens einem Gebäude zuordnen');
end;

Luckie 28. Mai 2006 12:55

Re: Aufrufende Prozedur verlassen
 
Zitat:

Zitat von fkerber
Bedeutend schöner fände ich es jetzt allerdings, wenn die Error-Prozedur auch dieses Exit gleich mit veranlassen könnte. Geht das irgendwie?

Einfach eine Exception werfen:
Delphi-Quellcode:
procedure DoSomething;
begin
  raise Exception.Create('Fehler');
  ShowMessage('dumdidum');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    DoSomething;
  except
    on E: Exception do ShowMessage(E.Message);
  end;
end;
Das ShowMessage aus DoSomething wird nicht mehr angezeigt, die Prozedur wurde also verlassen.

Olli 28. Mai 2006 12:58

Re: Aufrufende Prozedur verlassen
 
Zitat:

Zitat von Luckie
Einfach eine Exception werfen

~15min zu spät. Findest du es nicht irgendwie ignorant das oben zu übergehen um nochmal den gleichen Tip loszuwerden? :roll:

Luckie 28. Mai 2006 13:01

Re: Aufrufende Prozedur verlassen
 
Ich habe es nur noch mal an einem Codebeispiel demonstriert, was soll daran arrogant sein? :?

Olli 28. Mai 2006 13:10

Re: Aufrufende Prozedur verlassen
 
Zitat:

Zitat von Luckie
Ich habe es nur noch mal an einem Codebeispiel demonstriert, was soll daran arrogant sein? :?

:| Okay, vergiß es, die Antwort war genug um meine Aussage zu bestätigen. Das Nicht-Ignorieren anderer Leute kann sich durch Verständnisgewinn auszahlen ... :roll:

Luckie 28. Mai 2006 13:15

Re: Aufrufende Prozedur verlassen
 
Sorry, habe mich vertan, sollte nicht arrogant, sondern ignorant heißen. Ich wollte ihm eben nur mal ein kurzes Codebeispiel an die Hand geben.

fkerber 28. Mai 2006 13:22

Re: Aufrufende Prozedur verlassen
 
Hi!

Danke, ich werds mir anschauen!

zu den if-Schachtelungen:
Da es nicht nur eine Bedingung, sondern viele sind, gefällt mir diese Verschachtelei nicht.


Ciao Frederic


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 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