Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi RaiseException abfangen (https://www.delphipraxis.net/51441-raiseexception-abfangen.html)

brechi 12. Aug 2005 12:45


RaiseException abfangen
 
und zwar geht es mir um folgendes ;P

Delphi-Quellcode:
  try
     RaiseException($C0000003,0,0,nil);
  except
  end;
das try except sollte normalerweise dsa RaiseException abfangen
leider klappt das nicht und in assembler bekomm ich das auch nicht wieder richtig hin :/

vielleicht kennt einer ne lösung wie RaiseException aufrufen kann aber keine fehlermeldung kommt

tigerman33 12. Aug 2005 13:08

Re: RaiseException abfangen
 
Du musst dem try..except schon noch sagen welche exceptions er abfangen soll. Alle, die nicht aufgeführt sind, werden an den nächsthöheren exception-handler weitergegeben.
Delphi-Quellcode:
try
  ...
except
  on EListError do
    Irgendwas;
end;
Warum willst du überhaupt eine exception schmeißen, wenn du sie dann sofort wieder abfängst? Der einzige Grund, den ich dafür sehen könnte, ist dass du ein bestimmtes Verhalten des Programms erreichen willst, nämlich so als ob der entsprechende Fehler aufgetreten sei. Das lässt sich aber ohne exception dann eleganter lösen.

BlackJack 12. Aug 2005 13:09

Re: RaiseException abfangen
 
kommt die fehlermeldung nur in der IDE, oder auch, wenn du die .exe selber aufrufst?
und geht es denn, wenn du die VCL-Exception-kapselung benutz, also z.b.
Delphi-Quellcode:
raise Exception.Create;
?

Flocke 12. Aug 2005 13:16

Re: RaiseException abfangen
 
Zitat:

Zitat von tigerman33
Du musst dem try..except schon noch sagen welche exceptions er abfangen soll.

Nö, muss man nicht. Wenn man überhaupt kein on ... angibt, dann werden alle Exceptions abgefangen.

[Nachtrag]

Delphi-Quellcode:
try
  RaiseException($C0000003, 0, 0, nil);
except
  MessageDlg('Exception gefangen', mtInformation, [mbOk], 0);
end;
geht bei mir, da kriege ich den Info-Dialog.

brechi 12. Aug 2005 13:53

Re: RaiseException abfangen
 
hm ja in einer VCL anwendung geht des aber in einer konsolenanwendung nicht oO

Flocke 12. Aug 2005 13:58

Re: RaiseException abfangen
 
Hmmm :gruebel:
Das geht bei mir auch in einer nonVCL-Anwendung!
Delphi-Quellcode:
try
  RaiseException($C0000003, 0, 0, nil);
except
  MessageBox(Handle, 'Exception gefangen', 'Info', MB_ICONINFORMATION or MB_OK);
end;
[Nachtrag]
Achso: Kommandozeile :stupid: Muss ich noch mal ausprobieren...

Olli 12. Aug 2005 14:00

Re: RaiseException abfangen
 
Zitat:

Zitat von Flocke
Das geht bei mir auch in einer nonVCL-Anwendung!

Konsole ist zwar auch "nonVCL", benutzt ja nicht die VCL, aber mit nonVCL bezeichnet man nur graphische Programme - daher mußt du es wohl nochmal mit APPTYPE CONSOLE überprüfen.

Die einzelnen benutzten Delphiversionen wären interessant!

Flocke 12. Aug 2005 14:02

Re: RaiseException abfangen
 
Kommandozeile geht bei mir auch
Delphi-Quellcode:
try
  RaiseException($C0000003, 0, 0, nil);
except
  writeln('Exception gefangen');
end;
Alles mit Delphi 2005 Prof.

brechi 12. Aug 2005 14:03

Re: RaiseException abfangen
 
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  windows;

begin
  try
    RaiseException($C0000003, 0, 0, nil);
  except
    writeln('Exception gefangen');
  end;
  readln;
end.
delphi7
das geht net! prog beendet sich sofort mit IDE und ohne kommt die exception

Flocke 12. Aug 2005 14:11

Re: RaiseException abfangen
 
Ich hatte gerade noch zwei Zeilen mehr geschrieben, ansonsten ist's aber identisch:
Delphi-Quellcode:
program cmdLine;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

begin
  { TODO -oUser -cConsole Main : Hier Code einfügen }
  writeln('Hier sind wir!');
  try
    RaiseException($C0000003, 0, 0, nil);
  except
    writeln('Exception gefangen');
  end;
  writeln('Und hier sind wir auch');
  readln;
end.
Ergebnis mit IDE (nach Fehlermeldung und klicken auf "Fortfahren"):
Code:
Hier sind wir!
Exception gefangen
Und hier sind wir auch
Ergebnis ohne IDE (ohne jede Fehlermeldung):
Code:
Hier sind wir!
Exception gefangen
Und hier sind wir auch

brechi 12. Aug 2005 14:12

Re: RaiseException abfangen
 
oha liegt daran das ich sysutils nicht eingebunden habe
nimm das mal bitte weg und schau ob es dann noch funktioniert

Olli 12. Aug 2005 14:19

Re: RaiseException abfangen
 
Eure Testsysteme haben welches OS?

Ich poste gleich das Ergebnis für Delphi 3 und 4 Pro.

@brechi: Sorry, hatte deinen Post übersehen. Die Unit könnte es natürlich auch sein.

Flocke 12. Aug 2005 14:24

Re: RaiseException abfangen
 
Zitat:

Zitat von brechi
oha liegt daran das ich sysutils nicht eingebunden habe
nimm das mal bitte weg und schau ob es dann noch funktioniert

Mache ich gleich, dauert aber noch einen Moment, mein Delphi ist mir gerade (mal wieder) abgeschmiert...

So, stimmt, ohne SysUtils schmiert er ab - IDE ist direkt beendet, Kommandozeile kommt
Code:
Hier sind wir!
Runtime error 255 at 7C81EB33
Soweit bist du aber wohl schon.

@Olli: XP Prof. SP 2, hab' aber div. VMs, mit denen ich das noch ausprobieren könnte.

brechi 12. Aug 2005 14:24

Re: RaiseException abfangen
 
hab 2k mit Delphi7

mit sysutils gehts, ohne nicht

ne integerdivision fängt der aber ohne probleme auch ohne eingebundene Sysutils ab
folgenden code hab ich im moment:

Delphi-Quellcode:
program Project2;

uses
  windows;

procedure crash_ollydbg;
asm
  pushad
  push offset @@handler
  xor eax, eax
  push fs:[eax]
  mov fs:[eax], esp
  mov ebx, esp
  push eax
  push $73257325
  push esp
  push $5
  push esp
  push $2
  push eax
  push $40010006
  call RaiseException
@@handler:
  mov eax, [esp+$C]
  mov esp, [eax+$A4]
  xor eax, eax
  pop fs:[eax]
  pop eax
  popad
end;

begin
  crash_ollydbg;
  MessageBox(0,'you will never see me with ollydbg attached',nil,0);
end.
dafür nutze ich EBX aus um ESP zu speichern weil das innerhalb von RaiseException bis zur Exception nicht mehr geändert wird un später im Exception Record bzw im Exception Conext auf das alte ESP zeigt damit ich die vorher gepusheten resiger wieder ordentlich füllen kann

dabei ist es mir wichtig das ich RaiseException aufrufen kann und nicht OutputDebugStringA (was das selbe in dem fall wäre)
nur weiß ich nicht pb das überall funtkioniert, da ich nicht garantieren kann das EBX nicht unter 95/98/ME/2k etc. geändert wird

deshalb würd ich am liebsten try except nehmen, aber viewlleicht kenn einer noch eine andere assembler möglichkeit :)

BlackJack 12. Aug 2005 18:48

Re: RaiseException abfangen
 
Zitat:

Zitat von brechi
dafür nutze ich EBX aus um ESP zu speichern [..]

nur weiß ich nicht pb das überall funtkioniert, da ich nicht garantieren kann das EBX nicht unter 95/98/ME/2k etc. geändert wird

EBX darfst du normalerweise bei Delphi nicht verändern, da Delphi da gewisse sachen drin speichert und nicht erwartet, dass EBX geändert wird.

p.s.: so ist das zumindest bei VCL-anwendungen, wie das bei Konsolenanwendungen ist weiss ich nicht.

brechi 12. Aug 2005 18:54

Re: RaiseException abfangen
 
ne es geht nur darum obs in RaiseException geändert wird

ich push ja alle register aufn stack und hol sie später zurück

Olli 12. Aug 2005 19:18

Re: RaiseException abfangen
 
Zitat:

Zitat von BlackJack
EBX darfst du normalerweise bei Delphi nicht verändern, da Delphi da gewisse sachen drin speichert und nicht erwartet, dass EBX geändert wird.

Dies gilt für OOP-Anwendungen, da in EBX der Self-Zeiger weitergegeben wird. Ist in VC++ glaube ich analog.

Mit Sysutils
D3 fängt in der IDE die Exception ab (IDE) und außerhalb der IDE auch (Programm).
D4 dito

Ohne Sysutils
D3 fängt es in der IDE nicht ab, außerhalb auch nicht
D4 dito

Achso, ebenfalls W2K!

BlackJack 12. Aug 2005 19:26

Re: RaiseException abfangen
 
Zitat:

Zitat von Olli
Zitat:

Zitat von BlackJack
EBX darfst du normalerweise bei Delphi nicht verändern, da Delphi da gewisse sachen drin speichert und nicht erwartet, dass EBX geändert wird.

Dies gilt für OOP-Anwendungen, da in EBX der Self-Zeiger weitergegeben wird. Ist in VC++ glaube ich analog.

ah, gut zu wissen. kann ich denn dann in procduren, die keine Methoden sind, EBX verändern?

Olli 12. Aug 2005 22:13

Re: RaiseException abfangen
 
Zitat:

Zitat von BlackJack
ah, gut zu wissen. kann ich denn dann in procduren, die keine Methoden sind, EBX verändern?

Jain. Ich würde mich nur dann drauf verlassen, wenn die gesamte Funktion in Assembler geschrieben ist - also asm ... end statt begin ... end (als Funktionskörper). Ansonsten kannst du ja nicht wirklich sicher sein was andere aufgerufene Funktionen machen wenn der Compiler fröhlich "optimiert". Der besagte Typ Funktionen wird nämlich nicht nochmal optimiert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz