Warning C4290: C++ Exception Specification ignored



  • // Warum bekomme ich zwei mal diesen Fehler?
    // warning C4290: C++ Exception Specification ignored
    
    class aa {
    public:
    	aa::aa() throw(int); // <- Hier
    };
    
    aa::aa() throw(int) { // <- Und hier
    	throw 1;
    }
    
    int main(void) {
    	aa obj;
    
    	return 0;
    }
    


  • du hast da ein aa:: zuviel, so sähe es richtig aus:

    class aa {
    public:
        aa() throw(int); // <- Hier
    };
    
    aa::aa() throw(int) { // <- Und hier
        throw 1;
    }
    

    ansonsten sollte das so funktionieren.



  • Was willst du uns jetzt mit deinem Posting mitteilen? Das wissen wir doch selber. Und warum schaust du nicht in die MSDN, wo jeder ERROR und WARNING gut beschrieben wird?



  • @artchi er hat gefragt, warum er diese fehlermeldung bekommt...
    ist aber gut zu wissen, dass msvc keine exception spezifikationen für int kennt.

    nur für alle, die nicht suchen wollen:
    http://msdn2.microsoft.com/en-us/library/sa28fef8.aspx



  • Die Warnung also disabeln. Vielen Dank ghorst. 🙂
    @Artchi: Du solltest Dich vielleicht etwas beruhigen...



  • @martin_salo:
    wieso bist du eigentlich immer noch "unregistriert"??



  • martin_salo schrieb:

    Die Warnung also disabeln. Vielen Dank ghorst. 🙂
    @Artchi: Du solltest Dich vielleicht etwas beruhigen...

    NEIN!
    Keine Exception Specs verwenden wenn der Compiler sie nicht unterstützt, und MSVC unterstützt sie eben nicht. Genau das will dir der Compiler damit (mit der Warning) mitteilen.

    Exception Specs zu verwenden auf einem Compiler der sie nicht unterstützt fürht zu anderem Verhalten (!) als WENN der Compiler sie unterstützt, da Exceptions deren Typ nicht angegeben ist im ersten Fall einfach trotzdem "weiterfliegen" anstatt dass wie spezifiziert "unexpected()" aufgerufen wird. Und das ist BÖSE.

    Die einzige Exception Spec die du unter MSVC verwenden kannst ist "throw()", also "wirft nixe". Das kann man ruhig tun, zu Dokumentationszwecken. Ansonsten rate ich dir die Finger davon zu lassen, du handelst dir damit nur Ärger ein.

    Oder anders gesagt: wozu willst du bitte Exception Specs verwenden wenn der Compiler sie nicht unterstützt? Das ist genausogut wie wenn du nichts hinschreibst, oder es als Kommentar dazuschreibst. Letzteres (Kommentar) ist sogar besser, da dann wenigstens jeder Programmierer weiss dass er sich nicht darauf verlassen kann/darf.



  • Unabhängig vom Compiler: Exception Specifications sind böse. Sie sollten theoretisch etwas ähnliches wie Checked Exceptions in Java sein - da aber alles sowieso zur Runtime ausgewertet wird und im Prinzip eine falsche Exception im Endeffekt ein terminate() produziert, bringt es nicht viel. Es macht den Code aber aufgeblähter ohen mehr Sicherheit zu bringen. Es ist viel effektiver catch(...) Blöcke zu haben wenn man Angst vor einer falschen Exception hat.



  • Shade Of Mine schrieb:

    da aber alles sowieso zur Runtime ausgewertet wird und im Prinzip eine falsche Exception im Endeffekt ein terminate() produziert, bringt es nicht viel.

    es führt auf compiler, die damit klar kommen, nicht zwangsläufig zu einem terminate. es wird eine bad_execption geworfen. allerdings sollte man, wenn so etwas fängt, das programm mit einer angemessenen fehlermeldung beenden, da man keine ahnung hat, was da passiert ist und folglich auch nicht weiß, wie man darauf reagieren sollte. selbiges gilt übrigens auch catch(...). das sollte man am besten weiterwerfen, nachdem man aufgeräumt hat.


Anmelden zum Antworten