try-блок функция в кострукторе...
От: Аноним  
Дата: 26.04.03 11:13
Оценка:
Кто сможет сказать, почему происходит сбой там, где я закоментировал (_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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.