Autor Beitrag
schippi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 11:16 
Hallo, bei folgendem Programmcode funktioniert Try-Except nicht richtig.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Var
  Sum: PByte;
  Size: Integer;
Begin
  Size := 2147483646;
  GetMem(Sum, Size);

  try
    FillChar(Sum^, Size, 0);
  except
    showmessage('Blabla');
  end;
End;


Hier tritt bei FillChar eine Access Violation auf. Wieso springt das Programm nicht in except :?:

Was bei mir ebenfalls nicht funktioniert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 Try
   a:=1/0;
 except
   showmessage('Test');
   raise Exception.Create('Beispiel-Exception');
 End;


es wird except einfach übersprungen. Wenn ich es aber ein klein wenig ändere, dann springt das Programm in except und zeigt die Meldung 'Test' an, aber die Meldung 'Beispiel-Exception' wird nicht angezeigt.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
 Try
   a:=1;
   a:=a/0;
 except
   showmessage('Test');
   raise Exception.Create('Beispiel-Exception');
 End;


Also ich steh aufm Schlauch... :autsch:

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 22.10.07 11:28 
Anstelle von E:Exception kannst du alle Arten von Exceptions hernehmen. Mit E:Exception fängst du alle ab. Du kannst aber auch auf bestimmte eingehen wie in deinem Fall auf die EAccessViolation und darauf speziell reagieren. Raise musst du gar nicht aufrufen! Nimm einfach ein ShowMessage oder eine MessageBox mit dem jeweiligen Messagetyp.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  try
    // irgendwas
  except
    on E:Exception do begin
      // Hier eine Meldung anstelle der Exception ausgeben, RAISE braucht nicht aufgerufen werden  
    end;
  end;

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.


Zuletzt bearbeitet von Alpha_Wolf am Mo 22.10.07 11:31, insgesamt 1-mal bearbeitet
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mo 22.10.07 11:29 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  try
    GetMem(Sum, Size);
    FillChar(Sum^, Size, 0);
  except
    showmessage('Blabla');
  end;
End;

Da bereits in GetMem(); eine EOutOfMemory-Exception auftritt, solltest du diese auch mit in den Block nehmen. ;)

grüße,
Marc
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 22.10.07 11:34 
user profile iconMarc. hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
  try
    GetMem(Sum, Size);
    FillChar(Sum^, Size, 0);
  except
    on E:EOutOfMemory do begin
      showmessage('Blabla');
    end;

  end;
End;



Sonst gibt die App die Exception aus und danach deine Showmessage..

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.10.07 11:46 
Moin!

Auch sehr praktisch: ;)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
try
  GetMem(Sum, Size);
  FillChar(Sum^, Size, 0);
except
  ShowMessage(Exception(ExceptObject).Message); // Zeigt den Originaltext der Exception an
end;

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 11:47 
Hab jetzt alles probiert, was ihr mir empfohlen habt. Aber klappt bei mir immer noch net - ist immer noch so wie´s am Anfang war.
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 22.10.07 12:08 
Dann zeig mal deinen modifizierten Code.. hast du auch wirklich das "on E:Exception do begin end;" mit eingabracht im "except" Teil?

Nur Fehler die im Try-Block auftreten werden auch im Except-Block behandelt. Alles andere wird nicht abgefangen.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 12:27 
Hab mal ein neues Projekt erstellt und nur mal die verschiedenen Codestellen ausprobiert. Da hat komischerweise alles funktioniert.
Dann hab ich mein anderes Projekt genommen,das wenn ich nicht absichtlich einen Fehler provoziere, einwandfrei funktioniert. Nur wenn ich dann folgenden Code reinkopiere, gehts wieder net.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 Size := 2147483646;
  Try
    GetMem(Sum, Size);
    FillChar(Sum^, Size, 0);
  Except
    On E: EOutOfMemory Do
    Begin
      showmessage('Blabla');
    End;
  End;


Es kommt wieder beim FillChar des blöde Access Violation und nicht mein 'BlaBla' :bawling:
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Mo 22.10.07 12:30 
Bei mir funktioniert dein Code wunderbar. :roll:
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.10.07 12:31 
Moin!

user profile iconschippi hat folgendes geschrieben:
Es kommt wieder beim FillChar des blöde Access Violation und nicht mein 'BlaBla' :bawling:
Zunächstmal ist mir zwar schleierhaft, wozu man einen 2GB RAM-Block anfordern sollte (was auf jeder Win32-Maschine nicht klappen sollte...), aber nun gut. :?

Probier das nochmal so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
 Size := 2147483646;
  Try
    GetMem(Sum, Size);
    if Assigned(Sum) then
      FillChar(Sum^, Size, 0);
  Except
    ShowMessage(Exception(ExceptObject).Message);
  End;

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 12:35 
Mir fällt gerade noch ein, ich benutz in dem Projekt auch die TNBFPA-Socket Komponente von Narses. Ich glaub da werden die Fehlermeldungen irgendwie anders abgefangen. Kann das was mit meinem Problem zu tun haben?
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.10.07 12:46 
Moin!

user profile iconschippi hat folgendes geschrieben:
Mir fällt gerade noch ein, ich benutz in dem Projekt auch die TNBFPA-Socket Komponente von Narses. Ich glaub da werden die Fehlermeldungen irgendwie anders abgefangen. Kann das was mit meinem Problem zu tun haben?
Kommt darauf an, wo die Exception auftritt. Wenn du innerhalb der OnExecute-Methode eine Exception produzierst, dann wird das über die OnError-Methode abgewickelt, und nicht als Exception. :idea: (Steht aber auch genau so in der Doku! :les: ;) )

Aber ohne den Code zu kennen, kann ich nicht mehr dazu sagen. :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 12:46 
Hallo Narses!
Den 2 GB Ram-Block benutz ich ja nur um die Exception auszuprobieren. Sonst natürlich net.
Der Code funktioniert auch nicht in meinem Projekt. Kann das was mit deiner Komponente zutun haben? Weil in einem neuen Projekt funktionierts ja...

Viele Grüße
Schippi
Alpha_Wolf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 297

Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
BeitragVerfasst: Mo 22.10.07 12:50 
Wenn du dein Programm in deiner Laufzeitumgebung kompilierst und startest dann kommt immer die Exception (außer du stellst sie in den Projektoptionen aus) Starte mal die exe direkt in deinem Zielverzeichnis. Da sollte nur deine Meldung erscheinen.

_________________
Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 13:08 
Erwischt! Ich bin in der OnExcecute-Methode! :oops: Ich hab da wirklich net mehr dran gedacht.

Kann ich trotzdem den Fehler irgendwie abfangen, so dass kein Access violation kommt?

Zitat:
Alpha_Wolf:
Starte mal die exe direkt in deinem Zielverzeichnis. Da sollte nur deine Meldung erscheinen.


Dann wird das Programm einfach beendet ohne irgendeine Meldung.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.10.07 13:29 
Moin!

Hier mal der entsprechende Ausschnitt aus dem TNBFPA-Quelltext (Methode TProtocolAdapter.ParseStack):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
        if Assigned(FOnExecute) then // externer Prozessor zugewiesen?
          try // der externe Befehlsprozessor könnte eine Exception "erleiden"
            FOnExecute(FSender,Self); // dann aufrufen
          except // fangen, damit die eigenen Datenstrukturen nicht strubbelig werden
            if Assigned(FOnError) then
              FOnError(FSender,Self,paeException,Integer(ExceptObject));
          end;
Wie man sieht, werden Exceptions in der OnExecute-Methode gefangen und an die OnError-Methode weitergeleitet.

Jetzt kommt es darauf an, was genau passiert ist bzw. wie dein Code aussieht und warum die Exception aufgetreten ist. Es ist IMHO leider keine sonderlich schlaue Idee, mit dem Anfordern eines 2GB-RAM-Blocks einen Fehlerfall zu simulieren, weil Windows nach meiner Erfahrung mit speichermengenbasierten Problemen komische Reaktionen zeigt (und wenn nicht Windows, dann spätestens der Delphi-MemManager). Weiterhin könnte dein Code selbst "komisch" reagieren, wenn die Programmteile nach der Exception - die dann ja nicht durchlaufen werden - irgendwelche Datenstrukturen hätten initialisieren sollen, das aber nicht erfolgt ist und du später versuchst, darauf zuzugreifen. :idea:

Vielleicht solltest du einfach mal mit einer "realistischeren" Fehlersituation testen, da ich den 2GB-RAM-Block-Fall als unrealistisch ausschliessen würde (sowas würde ich schon vor dem Versuch abfangen)... :gruebel:

Weiterhin gilt:
user profile iconNarses hat folgendes geschrieben:
Aber ohne den Code zu kennen, kann ich nicht mehr dazu sagen. :nixweiss:


cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 14:03 
So unrealistisch find ich den Code gar net, weil ich hab ja eine Socketverbindung und bekomme einen String gesendet. Zusätzlich bekomm ich noch die Länge des Strings (Size).Würde ich jetzt 10 Zeichen bekommen, wäre Size=10.
Bei einem Übertragungsfehler, könnte der Wert in Size ja plötzlich riesengroß sein(z.B. 235627282). Dann würde ja in dem Code eine Exception ausgelöst werden.

ausblenden Delphi-Quelltext
1:
2:
  GetMem(Data, Size); 
  FillChar(Data^, Size, 0);


Oder sollte ich das vielleicht nicht unbedingt mit except abfangen?

Viele Grüße
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.10.07 14:09 
user profile iconschippi hat folgendes geschrieben:
Bei einem Übertragungsfehler, könnte der Wert in Size ja plötzlich riesengroß sein(z.B. 235627282).
user profile iconNarses hat folgendes geschrieben:
sowas würde ich schon vor dem Versuch abfangen
:les: ;)

_________________
There are 10 types of people - those who understand binary and those who don´t.
schippi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 22.10.07 14:31 
Alles klar :wink:

Danke an alle!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 22.10.07 15:20 
Moin!

user profile iconschippi hat folgendes geschrieben:
Mir fällt gerade noch ein,
Mir auch: ;)

user profile iconschippi hat folgendes geschrieben:
ich benutz in dem Projekt auch die TNBFPA-Socket Komponente von Narses.
Die können gar keine größeren Frames als 64KB transportieren; dein "2GB-Problem" ist damit also definitiv (zumindest auf Frame-Ebene des NBFPA) unmöglich. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.