std::bad_cast Exceptions == schlechter Stil?
-
Ist es eigentlich schlechter Stil wenn man im normalen Betriebsmodus eine Programmes ab und zu mal eine std::bad_cast exception generiert?
z. B. so:bool Audi::vergleicheBaureihe( const Car &otherCar ) { try { const Audi &audi = dynamic_cast<const Audi&>(otherCar); if(this->baureihe == audi->baureihe) return true; else return false; } catch (std::bad_cast) { return false; } }
der Grund warum ich frage ist, weil ich gesehen habe, dass mir Visual Studio explizit immer so tolle Debug-Meldungen wie "First-chance exception at 0x76d1b727 in base2.exe: Microsoft C++ exception: std::bad_cast at memory location 0x0033b0f8.." ausgibt - und ich mir deshalb überlegt habe, ob es sich hierbei im einen "sehr" schweren Ausnahmefehler handelt
-
Nur als Randbemerkung: Exceptions fängt man besser als Referenzen (wenns geht sogar als const Ref.).
Simon
-
Grundsätzlich ists relativ normal wenn mal ne exception fliegt und man die fängt. Allerdings kann man das in deinem Fall sicher auch anders lösen. Das Problem was du hast ist im Grunde ja, dass die Methode von zwei dynamischen Typen abhängig ist. Das nennt sich Multiple Dispatch, was in C++ nicht nativ vorhanden ist und das man auf verschiedene Arten lösen kann. dynamic_cast ist eine Möglichkeit, allerdings würde ich da eher auf Pointer zurückgreifen statt mit exceptions rumzuhantieren:
bool Audi::vergleicheBaureihe( const Car &otherCar ) const //<-- das const sollte auch rein { Audi const* audi = dynamic_cast<Audi const*>(&otherCar); return (audi != NULL && this->baureihe == audi->baureihe); }
-
Mal ne rein Praktische Frage, wann genau wirft dynamic_cast eigentlich? Ich hab beim benutzen immer nur nen gültigen oder nen NULL Pointer (falls der cast fehlschlägt) bekomen, aber noch nie ne exception.
-
Xebov@Logoff schrieb:
Mal ne rein Praktische Frage, wann genau wirft dynamic_cast eigentlich? Ich hab beim benutzen immer nur nen gültigen oder nen NULL Pointer (falls der cast fehlschlägt) bekomen, aber noch nie ne exception.
Mit Pointern gibts n Nullpointer wenns fehlschlägt, mit Referenzen ne Exception (weils keine "Null-Referenzen" gibt)