Кто сможет сказать, почему происходит сбой там, где я закоментировал (_BLOCK_TYPE_IS_VALID)? С одной стороны, обработчик try-блока функция в кострукторе должен передавать исключение вызывающей фун-ии, даже если не было явно этого указано (через throw

. В этом случае исключение должно быть перехвачено в вызывающей фун-ии, в данном случае в main(), но выходит так, что это исключение подавляется в обработчику в самом конструкторе и дальше никуда не передается (противоречит стандарту!!!) — это с другой стороны. Если же показать вручную, что данное исключенние передается вызывающей фун-ии, то все ок. Странно.
Представим ситуацию, когда конструктор базового класса порождает исключение, тогда оно перехватывается обработчиком производного и дальше никуда не передается(?). Но проблема не в этом. В фун-ии main() после выхода из try-блок выдается сообщение, в коментариях показано какое. Почему не проходит проверка _ASSERTE()? Ведь все же, на первый взгляд, правельно?
class Base
{
public:
Base()
{
throw exception("Exception occurred in class Base constructor");
}
~Base() {}
};
class A : public Base
{
public:
A(string val) try : Base(), val_(val)
{
throw exception("Exception occurred in class A constructor");
}
catch(exception& e)
{
cout << e.what() << endl;
// throw;
}
~A() {}
private:
string val_;
};
int main()
{
try
{
A a("eat this");
} // _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
catch(exception& e)
{
cout << e.what() << endl;
}
return 0;
}
Здравствуйте, <Аноним>, Вы писали:
[]
Какой комилятор? На VC++ 7.1 все ok.
Здравствуйте, MaximE, Вы писали:
ME>Здравствуйте, <Аноним>, Вы писали:
ME>[]
ME>Какой комилятор? На VC++ 7.1 все ok.
Тоже седьмая версия. Наблюдал интересную вещь: поместил перед try-блоком в фун-ии main() вызов оператора <<() для cout, и ошибки не стало, но вновь, убрав эту сторчку, выскакивает окно с ошибко

. Какой-то баг...