Is there any good practice related to dynamic_cast error handling (except not using it when you don\'t have to)? I\'m wondering how should I go about NULL and bad_cast it can th
If the dynamic_cast
should succeed, it would be good practice to use boost::polymorphic_downcast
instead, which goes a little something like this:
assert(dynamic_cast(o) == static_cast(o));
return static_cast(o);
This way, you will detect errors in the debug build while at the same time avoiding the runtime overhead in a release build.
If you suspect the cast might fail and you want to detect it, use dynamic_cast
and cast to a reference type. This cast will throw bad_cast
in case of error, and will take down your program. (This is good if, as you say, you are not going to recover anyway)
T& t = dynamic_cast(o);
t.func(); //< Use t here, no extra check required
Use dynamic_cast
to a pointer type only if the 0-pointer makes sense in the context. You might want to use it in an if
like this:
if (T* t = dynamic_cast(o)) {
t->func(); //< Use t here, it is valid
}
// consider having an else-clause
With this last option you need to make sure that the execution path makes sense if the dynamic_cast
returns 0.
To answer your question directly: I would prefer one of the two first alternatives I have given to having an explicit assert
in the code :)