Кто сможет сказать, почему происходит сбой там, где я закоментировал (_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;
}