assert unklar



  • ich habe eine c++ Konsolenanwendung mit vc++2008 erstellt.
    in meinem main habe ich

    assert( 1 > 2);
    

    und das Programm reagiert mit einer Konsolenausgabe UND einer abbrechen, wiederholen, ignorieren-Box

    Die Beschreibung von Assert sagt das, wenn ich es korrekt verstehe so nicht aus.

    Frage: wie kann ich die Box vermeiden ?
    Zusatzfrage: kann ich den Ausgabestring auch zusätzlich in das Ausgabefenster der Entwicklungsumgebung schubsen ?

    Hier der Text der Beschreibung:

    The destination of the diagnostic message depends on the type of application that called the routine. Console applications always receive the message through stderr. In a Windows-based application, assert calls the Windows MessageBox function to create a message box to display the message along with an OK button. When the user clicks OK, the program aborts immediately.

    When the application is linked with a debug version of the run-time libraries, assert creates a message box with three buttons: Abort, Retry, and Ignore. If the user clicks Abort, the program aborts immediately. If the user clicks Retry, the debugger is called and the user can debug the program if just-in-time (JIT) debugging is enabled. If the user clicks Ignore, assert continues with its normal execution: creating the message box with the OK button. Note that clicking Ignore when an error condition exists can result in undefined behavior.



  • Das Fenster kommt von deiner Runtime. Keine Ahnung ob du der das abdressieren kannst. Und darauf zugreifen kannst auch nicht direkt. Aber du kannst mal auf den MS-Developerseiten nachschauen, ob du in der Doku was findest.

    Prinzipiell ist das kein C++-Problem, sondern ein pattformspezifisches. Also erstmal falsches Unterforum.



  • Ist Starten mit F5 anders als Starten mit Strg+F5?
    An sich ist assert recht brauchbar inclusive des Werfens in den Debugger. Aber nicht perfekt, weshalb ich empfehle, sich ein eigenes assert oder ASSERT oder so zu basteln, das mit __asm int 3 in den Debugger geht und mit IsDebuggerPresent und OutputDebugString abgerundet werden könnte (und Exceptions wirf, statt zu aborten, was der eigentliche Grund für die Mühe dafür ist).



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • volkard schrieb:

    (und Exceptions wirf, statt zu aborten, was der eigentliche Grund für die Mühe dafür ist).

    iiiiiiihgitt


  • Mod

    hustbaer schrieb:

    volkard schrieb:

    (und Exceptions wirf, statt zu aborten, was der eigentliche Grund für die Mühe dafür ist).

    iiiiiiihgitt

    100% ACK

    Ich tendiere eher zu einem harten INT3 um dann einen Crashdump zu erzeugen.
    Ein ASSERT deutet auf eine Konstellation hin, die dem Konzept des Porgrammierers widerspricht. Eine Exception und eine evtl. Behandlung des Fehlers she ich als irreführend für den Entwickler an.

    Mich nerven schon die Exceptions die manche MFC Container werfen, wenn Indexe nicht im Range liegen.



  • Warum sollte ich das in der Datei XX gegebene Aufräum-Versprechen nur unter dem Vorwand brechen, daß in Datei YY ein Fehler auftrat?

    Die Exception ist dafür da, daß nachdem ich den Fehler lokalisiert und verstanden habe, ich sagen kann, "räum noch schnell auf bis hoch zu main" und die angefangene Buchung wird gerollbackt.
    Keine Bange, die hatte nicht den Zweck, später mal den Kunden darüber aufzuklären, daß er den Administrator holen soll, weil ein schwerer Anwendungsfehler aufgetreten ist. Kundencode hat kein assert mehr drin.
    Und natürlich werden AssertExceptions nicht behandelt und evtl übergangen.

    Wenn kein Debugger dahinter ist, bekomme ich dieselbe Bildschirmausgabe wie von assert auch, nur daß meine Ausgabe in der main() geschieht. Wenn ein Debugger mitläuft, lande ich genauso im Debugger wie mit assert auch, nur daß ich das Programm nicht abbrechen MUSS, sondern auch aufräumen lassen DARF. http://www.c-plusplus.net/forum/viewtopic-var-t-is-23425-and-postdays-is-0-and-postorder-is-asc-and-start-is-10.html


Anmelden zum Antworten