Exception Specifications, GCC



  • Jordy schrieb:

    VC++ scheint hier zu versagen.

    Was heisst hier "versagen"? Wie wärs, wenn du dir mal die Doku zum MSC durchliest ➡ C++ Language Reference, Exception Specifications



  • Auch noch ein wenig Lesestoff für Jordy und alle anderen interessierten:
    http://www.gotw.ca/publications/mill22.htm

    Superkurzfassung:
    Moral #1: Never write an exception specification.
    Moral #2: Except possibly an empty one, but if I were you I’d avoid even that.

    Edit:
    Noch mehr interessantes dazu:
    http://www.gotw.ca/gotw/082.htm



  • groovemaster schrieb:

    Jordy schrieb:

    VC++ scheint hier zu versagen.

    Was heisst hier "versagen"? Wie wärs, wenn du dir mal die Doku zum MSC durchliest ➡ C++ Language Reference, Exception Specifications

    Na, es versagt aus zwei Gründen: Zum ersten akzeptiert es throw(...), was nicht konform ist, und zweitens gibt es bei throw(typ) folgende Warnung aus: warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow), was auch nicht konform ist. Das heißt es werden nur throw() und throw(...) akzeptiert. Das nenne ich versagen.



  • Vergiss Exception Specifications und gut is 😎



  • vergessen! schrieb:

    Vergiss Exception Specifications und gut is 😎

    Darauf läufts hinaus, wenn man obige Links liest. Das größte Problem ist meines Erachtens: Was passiert wenn meine Spezifikationen nicht stimmen? Zu Compilzeit kann man das nicht ohne weiteres entdecken, außer man geht manuell alle Funktionen durch, immer unter dem Risko das man Vieles übersieht. Und dann wird das Programm beendet, obwohl es eigentlich fehlerfrei funktioniert.

    Gibt es Tools, die versuchen Exception-Spezifikationen per Compilezeit-Analyse zu prüfen? Soetwas müsste unter bestimmten Einschränkungen möglich sein.

    Ich erinnere mich an ein Tool, das zur Compilezeit (!!!) die Einhaltung von vordefinierten Wertebereichen von Funktions-Parametern überprüft hat. Das ganze war ziemlich komplex und hat viel Rechenzeit verbraucht wenn die Schachtelungstiefe zunahm, aber letztendlich hat es recht gut funktioniert.

    Im Prinzip ähnelt das der Aufgabenstellung der Einhaltung von Exceptions-Spezifikationen.



  • Jordy schrieb:

    Gibt es Tools, die versuchen Exception-Spezifikationen per Compilezeit-Analyse zu prüfen?

    Ja, Java. Und du siehst, wie mühsam es dort ist.

    Soetwas müsste unter bestimmten Einschränkungen möglich sein.

    Richtig, aber die Einschränkungen sind ziemlich drastisch.



  • Ringding schrieb:

    Jordy schrieb:

    Gibt es Tools, die versuchen Exception-Spezifikationen per Compilezeit-Analyse zu prüfen?

    Ja, Java. Und du siehst, wie mühsam es dort ist.

    Soetwas müsste unter bestimmten Einschränkungen möglich sein.

    Richtig, aber die Einschränkungen sind ziemlich drastisch.

    Aber für C++ hat deines Wissens nach noch niemand sowas versucht?



  • Du kannst das Problem haben, dass Du mit Bibliotheken arbeitest, von denen Du nicht weißt, ob sie mal eine Exception werfen. So kann Code, der Tage, Wochen oder Monate einwandfrei funktionierte plötzlich versagen. Versuch lieber exception-sicheren Code zu schreiben anstatt dich an den Exception-Spezifikationen aufzuhängen. Dazu gibt's im "Guru of the Week" oder im ausgelagerten Buch davon (Exceptional C++) gute Anleitungen.

    Das Tool das Du meinst, könnte Flexelint sein 😉



  • 7H3 N4C3R schrieb:

    Du kannst das Problem haben, dass Du mit Bibliotheken arbeitest, von denen Du nicht weißt, ob sie mal eine Exception werfen. So kann Code, der Tage, Wochen oder Monate einwandfrei funktionierte plötzlich versagen. Versuch lieber exception-sicheren Code zu schreiben anstatt dich an den Exception-Spezifikationen aufzuhängen. Dazu gibt's im "Guru of the Week" oder im ausgelagerten Buch davon (Exceptional C++) gute Anleitungen.

    Das Tool das Du meinst, könnte Flexelint sein 😉

    "PC-Lint" wenn ich mich recht erinnere 🙂
    Ist das identisch?

    Ja, klar, die Bibliothken sind ein Knackpunkt. Wenn man aber z.B. Bibliotheken verwendet, die, wie meine im Augenblick, grundsätzlich *garkeine* Exceptions werfen (ausgenommen der Standard-Exceptions der C++-Runtime) dann ist das kein großes Problem.



  • Jordy schrieb:
    Gibt es Tools, die versuchen Exception-Spezifikationen per Compilezeit-Analyse zu prüfen?
    Ja, Java. Und du siehst, wie mühsam es dort ist.

    Zitat:
    Soetwas müsste unter bestimmten Einschränkungen möglich sein.
    Richtig, aber die Einschränkungen sind ziemlich drastisch.

    Ich find es eigentlich eine Schwäche von C++. Weil man jeden Typ throwen kann, kann eine Funktion ohne exception-Spezifikation alles werfen und eine zweite Funktion die erstere Benutzt kann nicht sagen, was geworfen wird, außer sie würde mit einem ein catch(...) alles fangen.
    Dafür dann Tips, dass man das nothrow besser in den Kommentar schreibt. Und das bei C++, wo es doch alle so geil finden, dass man dank Templates etc. alles zur Compile-Zeit prüfen kann.



  • Unter Java sind Exception Specifications eine Qual!



  • Jordy schrieb:

    Na, es versagt aus zwei Gründen: Zum ersten akzeptiert es throw(...)

    Und wo ist das Problem dabei? Noch nie was von Compilererweiterungen gehört?

    Jordy schrieb:

    und zweitens gibt es bei throw(typ) folgende Warnung aus: warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow), was auch nicht konform ist.

    Nun, kein Compiler unterstützt den Standard zu 100%. Bisher wurde dies beim MSC nicht integriert, da es zu viel Arbeit für zu wenig Nutzen war (wenn ich da einige Artikel noch richtig in Erinnerung habe). Vielleicht hast du ja bei kommenden Versionen mehr Glück.


Anmelden zum Antworten