Поскольку dynamic_cast<T*>
не генерирует исключения, один из блоков try-catch совершенно не нужен.
Однако вы можете легко определить свою собственную функцию приведения, которая действительно выдает исключение для указателей.Это то, что я делаю в своем собственном коде (упрощенный код, и учтите, что я использую сборщик мусора, чтобы я мог без всяких последствий бросать указатели):
template <class Class, class Object>
inline Class* cast (Object* obj)
{
Class* result = dynamic_cast<Class*>(obj);
if( obj != null and result == null ){
throw new ClassCastException(); // unusual, throw bad_cast if you prefer
}
return result;
}
template <class Class, class Object>
inline const Class* cast (const Object* obj)
{
const Class* result = dynamic_cast<const Class*>(obj);
if( obj != null and result == null ){
throw new ClassCastException(); // unusual, throw bad_cast if you prefer
}
return result;
}
Кроме того, я также использую егосинтаксический сахар для static_cast, но это возможно только потому, что я не использую его для динамических ссылок и константных ссылок:
template <class Class, class Object>
inline Class cast (const Object& obj)
{
return static_cast<Class>(obj);
}
Я бы сказал, что вам лучше реализовать собственную функцию приведения, которая согласована в терминахобработки исключений и делать именно то, что вы хотите и ожидаете.Я сделал и никогда не оглядывался назад.