Autor |
Beitrag |
schippi
      
Beiträge: 23
|
Verfasst: Mo 22.10.07 11:16
|
|
Alpha_Wolf
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: 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.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| try except on E:Exception do begin 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.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mo 22.10.07 11:29
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
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: Mo 22.10.07 11:34
_________________ Diskutiere nie mit einem Irren - er zieht dich auf sein Niveau und schlägt dich mit seiner Erfahrung.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.07 11:46
Moin!
Auch sehr praktisch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| try GetMem(Sum, Size); 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 
      
Beiträge: 23
|
Verfasst: 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
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: 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.
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' 
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: Mo 22.10.07 12:30
Bei mir funktioniert dein Code wunderbar. 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.07 12:31
Moin!
schippi hat folgendes geschrieben: | Es kommt wieder beim FillChar des blöde Access Violation und nicht mein 'BlaBla'  |
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: 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 
      
Beiträge: 23
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.07 12:46
Moin!
schippi 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.  (Steht aber auch genau so in der Doku!  )
Aber ohne den Code zu kennen, kann ich nicht mehr dazu sagen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
schippi 
      
Beiträge: 23
|
Verfasst: 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
      
Beiträge: 297
Ubuntu, Win XP, Win Vista
C#, Delphi 6 Prof, Delphi 2007 Prof, Java
|
Verfasst: 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 
      
Beiträge: 23
|
Verfasst: Mo 22.10.07 13:08
Erwischt! Ich bin in der OnExcecute-Methode!  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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.07 13:29
Moin!
Hier mal der entsprechende Ausschnitt aus dem TNBFPA-Quelltext (Methode TProtocolAdapter.ParseStack):
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| if Assigned(FOnExecute) then try FOnExecute(FSender,Self); except 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.
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)...
Weiterhin gilt: Narses hat folgendes geschrieben: | Aber ohne den Code zu kennen, kann ich nicht mehr dazu sagen.  |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
schippi 
      
Beiträge: 23
|
Verfasst: 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.
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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.07 14:09
|
|
schippi 
      
Beiträge: 23
|
Verfasst: Mo 22.10.07 14:31
Alles klar
Danke an alle!
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 22.10.07 15:20
Moin!
schippi hat folgendes geschrieben: | Mir fällt gerade noch ein, |
Mir auch:
schippi 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.
|
|