![]() |
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! |
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.
|
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:
oder nachträglich versuchen den GUI-Mode etwas rückgängig zu machen.
{System.}ExceptProc := @ConsoleExceptHandler;
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; ; |
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? |
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 11:25 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