Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi try...except - Manuell in except springen (https://www.delphipraxis.net/119013-try-except-manuell-except-springen.html)

Yheeky 19. Aug 2008 14:29


try...except - Manuell in except springen
 
Hi,

ich habe einen try...except Block und würde gerne bei Misslingen einer bestimmten Abfrage in den Exception-Block springen. Wie kann ich das anstellen?
Sicher geht auch die Variante auch mit mehreren if-Abfragen, aber dieser Weg würde mich mal interessieren.

Bernhard Geyer 19. Aug 2008 14:31

Re: try...except - Manuell in except springen
 
Wie wäre es den das du eine Exception raised.

Delphi-Quellcode:
raise MyException.Create('BlaBla');

Deep-Sea 19. Aug 2008 14:31

Re: try...except - Manuell in except springen
 
Meinst du Abort?!

Apollonius 19. Aug 2008 14:31

Re: try...except - Manuell in except springen
 
Entweder du wirfst selbst eine Exception (z.B. EAbort), oder du verweist im Except auf eine Subroutine, die du dann aufrufst. Ich würde letzteres bevorzugen, weil es nicht so unperformant wie eine Exception ist.

Yheeky 19. Aug 2008 14:38

Re: try...except - Manuell in except springen
 
Mhmm, also ich weiss noch nicht so recht, wie ich das anstellen soll. Hier mal mit Codeausschnitt:

Delphi-Quellcode:
try
  if Form1.Label1.Caption <> 'Administrator' then
  // Exception werfen

  // Hier erfolgt die eigentliche Verarbeitung, weswegen ich zur try...except
  // gegriffen habe

except
  ShowMessage('Vorgang nicht erfolgreich');
end;

Deep-Sea 19. Aug 2008 14:41

Re: try...except - Manuell in except springen
 
Wenn es nichts komplexeres gibt, kannst du doch auf den ganzen Try-except-Block verzichten, oder?

Delphi-Quellcode:
If Form1.Label1.Caption <> 'Administrator' then
  raise Exception.Create('Fehler');

// Weiterer Code
Wenn die Exception auftritt, führt er den "weiterern Code" logischerweise nicht aus ...

DeddyH 19. Aug 2008 14:42

Re: try...except - Manuell in except springen
 
Delphi-Quellcode:
procedure ShowError;
begin
  ShowMessage('Vorgang nicht erfolgreich');
end;

...
try
  if Form1.Label1.Caption <> 'Administrator' then
    begin
      ShowError;
      exit; //oder alternativ in einem else-Zweig weitermachen
    end;
except
  ShowError;
end;

Apollonius 19. Aug 2008 14:45

Re: try...except - Manuell in except springen
 
Genau so meinte ich das, Detlef.

DeddyH 19. Aug 2008 14:47

Re: try...except - Manuell in except springen
 
Ich auch, Exceptions in einem try-Block auszulösen ist eine Lösung, die sich für mich "nicht richtig anfühlt" :mrgreen:

mkinzler 19. Aug 2008 15:00

Re: try...except - Manuell in except springen
 
Zitat:

Zitat von DeddyH
Ich auch, Exceptions in einem try-Block auszulösen ist eine Lösung, die sich für mich "nicht richtig anfühlt" :mrgreen:

Warum es gibt doch auch Menschen, die in die Säge langen, weil sie keinen Bock auf Arbeit haben :stupid:

DeddyH 19. Aug 2008 15:07

Re: try...except - Manuell in except springen
 
[OT] Ich habe zu Hause ein Buch zu Java, wo in einem Beispiel eine Datei folgendermaßen eingelesen wird (liebe Kinder, bitte nicht nachmachen):
- Datei öffnen
- try
- in einer Endlosschleife Zeile einlesen
- except
- Dateiende erreicht

Was soll man dazu noch sagen? [/OT]

mkinzler 19. Aug 2008 15:24

Re: try...except - Manuell in except springen
 
Ich habe irgendwo auch einen Delphi-Text gesehen, der eine Schleifen-Steuerung programmiert hat. So was als dreckig zu bezeichen, wäre aber stark untertrieben.

omata 19. Aug 2008 15:30

Re: try...except - Manuell in except springen
 
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
exit; //oder alternativ in einem else-Zweig weitermachen

Vielen Dank für dieses Kommentar. :hi:

hamburcher 19. Aug 2008 15:32

Re: try...except - Manuell in except springen
 
Wie wär's mit einem GoTo, das ein globales :Label (nicht TLabel!) anspringt?

Delphi kann das :mrgreen:

hamburcher 19. Aug 2008 15:41

Re: try...except - Manuell in except springen
 
Zitat:

Zitat von omata
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
exit; //oder alternativ in einem else-Zweig weitermachen

Vielen Dank für dieses Kommentar. :hi:

^ Der Kommentar ist nicht übel! Und viel besser als so manche "Signaturen" hier :drunken:

DeddyH 19. Aug 2008 15:49

Re: try...except - Manuell in except springen
 
Ich bin mir nicht sicher, ob der Kommentar auch richtig verstanden wurde :gruebel:

omata 19. Aug 2008 15:57

Re: try...except - Manuell in except springen
 
Meine Güte, jetzt wird hier wieder so ein Aufriss gemacht. Das war nicht meine Intention.
Ich habe mich persönlich über den Kommentar gefreut, weil er zeigt, dass hier wiedermal (wie so oft und im Prinzip immer) kein exit nötig ist. Das Problem kann strukturiert gelöst werden, es ist kein Sprung nötig.

Mehr war nicht und ich wollte hier nicht vom eigentlichen Problem ablenken.

hamburcher 19. Aug 2008 16:15

Re: try...except - Manuell in except springen
 
Zitat:

Zitat von omata
Meine Güte,... weil er zeigt, dass hier wiedermal (wie so oft und im Prinzip immer) kein exit nötig ist. Das Problem kann strukturiert gelöst werden, es ist kein Sprung nötig.

Mehr war nicht und ich wollte hier nicht vom eigentlichen Problem ablenken.

Es ist echt SEHR wissenswert, daß man OHNE exit programmieren kann.

Man sucht in ein paar Milliarden Datensätzen einen bestimmten. Der Gesuchte ist Nummer Zwei. Was soll's, einfach bis zum Ende durchlaufen lassen ohne exit...

:wiejetzt:

omata 19. Aug 2008 16:17

Re: try...except - Manuell in except springen
 
Schade, das du nicht verstanden hast worum es ging.

sirius 19. Aug 2008 16:22

Re: try...except - Manuell in except springen
 
Yheeky wollte einfach wissen, wie man eine Exception wirft. Und nicht, ob und warum eine Exception langsamer ist als andere Möglichkeiten. Er hat ein Beispiel dafür aufgeschrieben und man könnte ihm jetzt mal die Lösung zeigen. Denn wir ihr wisst, ist es nicht immer möglich nur mit Ifs zu arbeiten.

Delphi-Quellcode:
try
  if Form1.Label1.Caption <> 'Administrator' then
    raise Exception.Create('Du bist kein Administrator');
    //du kannst/solltest dir auch eine eigene Exceptionklasse von Exception ableiten


except
  on E:Exception do
    ShowMessage(e.message);
end;
Hier wäre jetzt noch ein Hinweis angebracht, dass das Auslösen einer Exception eine Weile dauert (aber auch nicht ewig lange).

Die Muhkuh 19. Aug 2008 16:35

Re: try...except - Manuell in except springen
 
Warum eigentlich try...except hier?

Delphi-Quellcode:
if Form1.Label1.Caption <> 'Administrator' then
begin
  try
    // Code ausführen, der try...except braucht.
  except
    // Mach hier auch irgendwas
  end;
end
else
  ShowMessage('Fehler!');
Fände ich sinnvoller.

Yheeky 19. Aug 2008 16:57

Re: try...except - Manuell in except springen
 
@sirius: Genau das wollte ich wissen. Danke!! :-)

Jelly 19. Aug 2008 20:29

Re: try...except - Manuell in except springen
 
Zitat:

Zitat von Die Muhkuh
Warum eigentlich try...except hier?

Das ist eine Interpretationsfrage. Ich würde dabei sogar noch weiter gehen, und eine eigene NoAdministratorException Klasse definieren, und diese dann auslösen. Um das Abfangen der Exception würde ich mich in dem Block des Programms überhaupt nicht kümmern. Wenn versucht wird, als nicht-Admin den Code auszuführen, fliegt dir die Exception um die Ohren. Und genau das ist Sinn der Sache. (Wenn du in windows ohne die nötigen Rechte versuchst eine Datei zu löschen, fliegt dir auch die Fehlermeldung um die Ohren.

Es ist nicht Sinn von Exception, vorhersehbare Fehler abzufangen, sondern wenn ein Programmteil nicht funktioniert (hier wegen mangenlden Rechten), eben einfach eine Exception auszulösen. Es ist an der aufrufenden Stelle dann dafür zu sorgen, wie die Exception interpretiert werden soll. Und wenn eine eigene Exception Klasse definiert wird, ist es auch gleich klar für den Aufrufer, was schief gelaufen ist.

Die Muhkuh 19. Aug 2008 20:31

Re: try...except - Manuell in except springen
 
Wäre es da nicht gleich sinnvoller zu überprüfen, ob das eigene Programm Adminrechte hat und wenn nicht, gleich einen Hinweis einzublenden und den entsprechenden Button zu deaktivieren?

Wobei es hier, so glaube ich, auch nicht um den richtigen Administrator geht, sondern nur um einen Status in seiner Software.


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