![]() |
RaiseException abfangen
und zwar geht es mir um folgendes ;P
Delphi-Quellcode:
das try except sollte normalerweise dsa RaiseException abfangen
try
RaiseException($C0000003,0,0,nil); except end; 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 |
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:
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.
try
... except on EListError do Irgendwas; end; |
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;
|
Re: RaiseException abfangen
Zitat:
[Nachtrag]
Delphi-Quellcode:
geht bei mir, da kriege ich den Info-Dialog.
try
RaiseException($C0000003, 0, 0, nil); except MessageDlg('Exception gefangen', mtInformation, [mbOk], 0); end; |
Re: RaiseException abfangen
hm ja in einer VCL anwendung geht des aber in einer konsolenanwendung nicht oO
|
Re: RaiseException abfangen
Hmmm :gruebel:
Das geht bei mir auch in einer nonVCL-Anwendung!
Delphi-Quellcode:
[Nachtrag]
try
RaiseException($C0000003, 0, 0, nil); except MessageBox(Handle, 'Exception gefangen', 'Info', MB_ICONINFORMATION or MB_OK); end; Achso: Kommandozeile :stupid: Muss ich noch mal ausprobieren... |
Re: RaiseException abfangen
Zitat:
Die einzelnen benutzten Delphiversionen wären interessant! |
Re: RaiseException abfangen
Kommandozeile geht bei mir auch
Delphi-Quellcode:
Alles mit Delphi 2005 Prof.
try
RaiseException($C0000003, 0, 0, nil); except writeln('Exception gefangen'); end; |
Re: RaiseException abfangen
Delphi-Quellcode:
delphi7
program Project1;
{$APPTYPE CONSOLE} uses windows; begin try RaiseException($C0000003, 0, 0, nil); except writeln('Exception gefangen'); end; readln; end. das geht net! prog beendet sich sofort mit IDE und ohne kommt die exception |
Re: RaiseException abfangen
Ich hatte gerade noch zwei Zeilen mehr geschrieben, ansonsten ist's aber identisch:
Delphi-Quellcode:
Ergebnis mit IDE (nach Fehlermeldung und klicken auf "Fortfahren"):
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.
Code:
Ergebnis ohne IDE (ohne jede Fehlermeldung):
Hier sind wir!
Exception gefangen Und hier sind wir auch
Code:
Hier sind wir!
Exception gefangen Und hier sind wir auch |
Re: RaiseException abfangen
oha liegt daran das ich sysutils nicht eingebunden habe
nimm das mal bitte weg und schau ob es dann noch funktioniert |
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. |
Re: RaiseException abfangen
Zitat:
So, stimmt, ohne SysUtils schmiert er ab - IDE ist direkt beendet, Kommandozeile kommt
Code:
Soweit bist du aber wohl schon.
Hier sind wir!
Runtime error 255 at 7C81EB33 @Olli: XP Prof. SP 2, hab' aber div. VMs, mit denen ich das noch ausprobieren könnte. |
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:
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
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. 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 :) |
Re: RaiseException abfangen
Zitat:
p.s.: so ist das zumindest bei VCL-anwendungen, wie das bei Konsolenanwendungen ist weiss ich nicht. |
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 |
Re: RaiseException abfangen
Zitat:
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! |
Re: RaiseException abfangen
Zitat:
|
Re: RaiseException abfangen
Zitat:
|
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