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 Fehler in Konsole umleiten (https://www.delphipraxis.net/135830-fehler-konsole-umleiten.html)

SeddyAtWork 18. Jun 2009 15:01


Fehler in Konsole umleiten
 
Hallo zusammen,
folgende Situation:
Ich habe eine Konsollen/Gui-Hybridanwendung, sprich ich kann mit writeln in die Konsole schreiben,
und mit showMessage ein Popup erstellen. Wenn ich nun einen Fehler produziere, z.B. Stelle 11 eines
10 Stelligen Arrays beschreiben, kommt solange Application.Run noch nicht ausgeführt wurde ein Fehler
in der Konsole, wenn das GUI schon gestartet ist erscheint die selbe Fehlermeldung als Popup-Fenster.
Da das Programm auf unserem Rechencluster(ohne Bildschirme) läuft, möchte ich, dass alle Fehlermeldungen
zu jeder Zeit in der Konsole ausgegeben werde, ist das realisierbar?
Kleiner Hinweis: die GUI komplett ab zu schalten, weil sie sowieso niemand sehen kann, kommt nicht
in Frage, der Aufwand wäre zu groß.
Schonmal vielen Dank für Lösungsvorschläge!

sirius 18. Jun 2009 15:08

Re: Fehler in Konsole umleiten
 
Nahezu alle Fehler kommen beim Objekt Application vorbei. Dort wird dann ein Ereignis ausgelöst (OnException oder so ähnlich). Das kannst du dafür nutzen.

himitsu 18. Jun 2009 15:09

Re: Fehler in Konsole umleiten
 
Wenn du da keine GUI nutzt, warum initialisierst du siese denn erst? (mit Application.Initialize)
Nja egal.

Du könntest einen Eigenen Exception-Handler registrieren,
Delphi-Quellcode:
{System.}ExceptProc := @ConsoleExceptHandler;
oder nachträglich versuchen den GUI-Mode etwas rückgängig zu machen.
Delphi-Quellcode:
IsConsole := False;

Delphi-Quellcode:
procedure ConsoleExceptHandler(ExceptObject: TObject; ExceptAddr: Pointer); far;
var
  Title: array[0..63] of Char;
  Buffer: array[0..1023] of Char;
  OemBuffer: array[0..2047] of AnsiChar;
  Dummy: Cardinal;
begin
  ExceptionErrorMessage(ExceptObject, ExceptAddr, Buffer, SizeOf(Buffer));
  Flush(Output);
  CharToOem(Buffer, OemBuffer);
  WriteFile(GetStdHandle(STD_ERROR_HANDLE), OemBuffer, StrLen(OemBuffer), Dummy, nil);
  WriteFile(GetStdHandle(STD_ERROR_HANDLE), sLineBreak, 2, Dummy, nil);
  Halt(1);
end;


;

SeddyAtWork 18. Jun 2009 15:32

Re: Fehler in Konsole umleiten
 
Erstmal Danke für die schnellen Antworten.
Mit isConsole kann ich nur den gegenteiligen Zweck erreichen, sprich Popups trotz nicht initialisierter GUI,
der ExceptionHandler ist implementier, und funktioniert auch teilweise, ich habe ihn vor dem initialisieren der GUI initialisiert, und er wird aufgerufen, wenn direkt danach ein Fehler kommt, aber des initialisieren der GUI scheint ihn wieder zu überschreiben, denn wenn die GUI aktiv ist kommen wieder Popups.
Ich habe versucht, den ExceptionHandler nach dem starten der GUI nochmal zu initialisieren, das hat aber nichts gebracht.
Wie kann ich den ExceptionHandler dauerhaft initialisieren?

SeddyAtWork 19. Jun 2009 11:25

Re: Fehler in Konsole umleiten
 
So, eine Lösung ist gefunden.
Das Problem war, dass die wärend der Laufzeig der GUI geworfenen Exceptions nicht ungebremmst geworfen wurden, sie wurden nämlich abgefangen, und verarbeitet, ohne, dass mein ExceptionHandler etwas davon mitbekommen hat.
Die Lösung des ganzen war im Delphi-Sourcecode die Funktion TApplication.ShowException um die simple Zeile writeLn(E.Message) zu ergänzen, jetzt erscheint ein Popup-Fenster und eine Meldung wird auf der Konsole ausgegeben, damit kann ich dann leben.
Vielen Dank, dass ihr mich in die richtige Richtung geschubst habt ;-)


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