У меня вопрос, как отловить исключение в списке инициализации.
Например, у нас есть класс Foo, производный от Bar
class Foo {
public:
Foo(int i) {throw 0; }
}
class Bar : public Foo{
public:
Bar() : Foo(1) {}
}
У меня вопрос, как отловить исключение в списке инициализации.
Например, у нас есть класс Foo, производный от Bar
class Foo {
public:
Foo(int i) {throw 0; }
}
class Bar : public Foo{
public:
Bar() : Foo(1) {}
}
Я думаю, что синтаксис похож на this (хотя лучше улавливать такие вещи в вызывающем. И что ты собираешься делать, когда поймаешь это?)
Bar::Bar()
try
: Foo(1)
{
}
catch( const SomeException &e )
{
}
catch
не генерирует исключение сам по себе, исходное исключение автоматически генерируется повторно (подробности см. В связанном GOTW).
- person sth; 14.03.2010
return
.
- person Potatoswatter; 14.03.2010
return;
в теле такого catch
блока для ctor-инициализатора (в отличие от блока catch других блоков try-функций).
- person Johannes Schaub - litb; 14.03.2010
В C ++ есть механизм для этого, но он используется редко. Это функциональный блок try:
Bar::Bar()
try
: Foo(1)
{
}
catch( Something )
{
}
См. Этот классический gotw, в котором объясняется, почему его следует использовать только для преобразования исключений (например, тип исключения FooException становится BarException).
Я считаю, что это должно быть обнаружено процедурой создания объекта.
Рассмотрите возможность замены проблемного экземпляра на _1 _ а>. Затем вы можете отложить его инициализацию в теле конструктора.