2009-12-25 3 views
6

Ab und zu gibt es einen starken Bedarf, ein Programm so zu schreiben, dass es niemals (wirklich nie) eine Fehlermeldung als Nachrichtenbox anzeigt. Zum Beispiel kann es ein Programm sein, das in einem täglichen Build ausgeführt wird - wenn es mit einer Nachrichtenbox hängt, hängt der tägliche Build.Liste der Dinge, die überprüft werden müssen, um zu verhindern, dass VC++ Anwendungen fatale Fehlermeldungen anzeigen

Leider bietet die VC++ - Laufzeit viele Möglichkeiten, Meldungsfelder beim Anzeigen von Fehlern auszulösen.

Zuerst, wenn eine Ausnahme nicht behandelt wird, wird terminate() aufgerufen, die abort() aufruft, die verursacht "Diese Anwendung hat die Laufzeit angefordert, um es auf eine ungewöhnliche Weise zu beenden." Nachrichtenbox. Dies kann umgangen werden, indem alle Ausnahmen abgefangen werden und/oder set_terminate() verwendet wird, um einen benutzerdefinierten terminate()-Handler ohne Meldungsfelder festzulegen.

Wenn eine Ausnahme während des Abwickelns des Stacks von einem Destrutor entfernt wird, wird auch terminate() aufgerufen. set_terminate() hilft auch hier.

Dann gibt es ein "pure virtual function call" Meldungsfeld, das in einigen hardcore Fällen der Mismatching die Anzahl der Funktionen, die von dem Aufrufer und denen von dem Aufrufer implementiert angezeigt wird. _set_purecall_handler() sollte hier helfen.

Was sonst noch zu einem VC++ - Programm zu tun, um absolut sicher zu sein, dass es in einer fatalen Situation kein Meldungsfeld zeigt?

+1

Die beiden Dinge, die Sie Fehler beschreiben zu übersetzen programmieren. Es scheint mir besser, sie nicht zu machen oder zumindest durch Code-Reviews zu entdecken, als ein Pflaster anzuwenden. –

+0

@Neil: Ja, sicher, aber es ist völlig unbequem, tägliche Builds hängen zu lassen. Wie du kommst am Montag erwartet, Ergebnisse von drei täglichen Builds zu sehen - von Samstag bis Montag - und sehen keine. Sie melden sich auf dem Build-Server an, nur um eines dieser Meldungsfelder anzuzeigen. Es wäre viel besser, drei Fehlerberichte mit einer darin protokollierten Nachricht zu sehen. – sharptooth

+0

@Neil: Ganz zu schweigen davon, dass Sie im Falle von Ausnahmen möglicherweise ein Fehlerprotokoll oder einen Dump des Stack-Trace hinzufügen möchten, anstatt dass Ihre Benutzer ein hässliches Meldungsfeld erhalten, das auf einen Fehler hinweist, den Sie nicht haben in der Lage, richtig zu untersuchen. –

Antwort

2

Ich würde empfehlen, dass Sie ein Hilfsprogramm verwenden, um es zu starten und diesen Helfer die Zeit zu begrenzen, die Ihr Programm ausführen kann. Dies ist bei weitem der sicherste Weg, wenn Sie es tun können, da es jeden Fall behandelt. Einige Dinge, die Sie nicht direkt in Ihrem Programm behandeln können, wie zum Beispiel "Dieses Programm ist keine gültige Win32-Anwendung", was passieren kann, wenn Sie eine DLL verpassen.

Verwandte Themen