AB> { if(i=2) throw Error;}У тебя уже здесь ошибка:)))
AB>
А если серьезно то так: при возникновении исключения при конструировании В (исключение возникло в конструкторе А), твой объект В не будет создан. Если это был локальный объект, то ты пишешь обычный try/catch блок, если объект глобален — то никак.
Of course, the code must be complete enough to compile and link.
Re: Как перехватить exception возникший в конструкторе
Но не все компиляторы это понимают (например, VC6 такого не умеет)
Кроме того, есть одна особенность. Из обработчика нельзя просто выйти. Если явно не указан throw (другого исключения или того же самого), то выбрасывается исходное исключение. Поэтому эта конструкция довольно редко бывает полезна. Т.к. деструкторы объектов базовых классов и членов, уже созданных на этот момент, вызовутся автоматически, а в тело данного конструктора мы еще не вошли. Можно, правда, вести логи или что-то подобное...
Здравствуйте, AlxB, Вы писали:
AB>Здраствуйте.
AB>Есть у меня класс, который возбуждает исключителюную ситуацию в конструкторе.
AB>Так вот, возможно ли в Bclass перехватить exception от Aclass?
AB>Или можно как то по другому создать экземпляр Aclass в Bclass (ну кроме как динамически).
AB>Спасибо.
Недавно я задавал такой вопрос.
У Страуструпа это делается так:
Но Visual C++ 6.0 этого не поддерживает. Если у тебя другой компилятор — тебе повезло. А вот как быть с VC++6.0 не знаю — и до сих пор не разобрался.
Re[2]: Как перехватить exception возникший в конструкторе
От:
Аноним
Дата:
27.02.03 13:38
Оценка:
Разбираться особо не в чем. Тебе дали неплохую ссылку, там нудно и многословно рассказали как и чего. Так в чем же проблема? Что тебе даст такой перехват исключения? Объект то ведь не будет создан в любом случае.
Re[3]: Как перехватить exception возникший в конструкторе
Здравствуйте, Аноним, Вы писали:
А>Разбираться особо не в чем. Тебе дали неплохую ссылку, там нудно и многословно рассказали как и чего. Так в чем же проблема? Что тебе даст такой перехват исключения? Объект то ведь не будет создан в любом случае.
В моем случае — создавался theApp. Если он не создается — было бы не плохо — отловить это исключение и корректно завершить программу. Как это можно сделать?
Re[4]: Как перехватить exception возникший в конструкторе
От:
Аноним
Дата:
27.02.03 13:59
Оценка:
Еще раз. НИКАК.Это глобальный объект. Переписывай тогда main, чтобы theApp создавался в нем (не знаю, можно ли в МФЦ так изгалиться и сделать такое, думаю, сложно).
Re[4]: Как перехватить exception возникший в конструкторе
Здравствуйте, Amor, Вы писали:
A>В моем случае — создавался theApp. Если он не создается — было бы не плохо — отловить это исключение и корректно завершить программу. Как это можно сделать?
Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.
Если он не глобальный, то заключи создание объекта theApp в try/catch.
... << RSDN@Home 1.0 beta 5 >>
Re[5]: Как перехватить exception возникший в конструкторе
Здравствуйте, Михаил Можаев, Вы писали:
ММ>Здравствуйте, Amor, Вы писали:
A>>В моем случае — создавался theApp. Если он не создается — было бы не плохо — отловить это исключение и корректно завершить программу. Как это можно сделать?
ММ>Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.
Как это до входа??? Это ведь вроде — entry point у exe-шника. Как это можно выполнить что-либо до него ???
Re[5]: Как перехватить exception возникший в конструкторе
ММ>Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.
Какая тогда функция вызывает конструкторы глобальных обьектов, если не CRTStartup ?
Re[6]: Как перехватить exception возникший в конструкторе
Здравствуйте, Amor, Вы писали:
ММ>>Если этот theApp — глобальный объект, то в момент его создания программа еще нечего завершать. Он создается до входа в mainCRTStartup/wmainCRTStartup/WinMainCRTStartup/wWinMainCRTStartup.
A>Как это до входа??? Это ведь вроде — entry point у exe-шника. Как это можно выполнить что-либо до него ???
Погорячился... Правильно все же было бы "до входа в main".
... << RSDN@Home 1.0 beta 5 >>
Re[2]: Как перехватить exception возникший в конструкторе
Здравствуйте, Amor, Вы писали:
A>Но Visual C++ 6.0 этого не поддерживает. Если у тебя другой компилятор — тебе повезло. А вот как быть с VC++6.0 не знаю — и до сих пор не разобрался.
Нет мне не повезло . Вобщем то меня это больше всего и интересовало. Спасибо всем ответившим.
.
Re[3]: Как перехватить exception возникший в конструкторе
Здравствуйте, Аноним, Вы писали:
А>Разбираться особо не в чем. Тебе дали неплохую ссылку, там нудно и многословно рассказали как и чего. Так в чем же проблема? Что тебе даст такой перехват исключения? Объект то ведь не будет создан в любом случае.
Да конечно, просто мне таким вот путем хотелось узнать почему BClass не создался, потому что в нем что то случилось или AClass "виноват"
.
Re[4]: Как перехватить exception возникший в конструкторе
Здравствуйте, AlxB, Вы писали:
AB>Да конечно, просто мне таким вот путем хотелось узнать почему BClass не создался, потому что в нем что то случилось или AClass "виноват"
Здравствуйте, Михаил Можаев, Вы писали:
ММ>Кроме того, есть одна особенность. Из обработчика нельзя просто выйти. Если явно не указан throw (другого исключения или того же самого), то выбрасывается исходное исключение. Поэтому эта конструкция довольно редко бывает полезна. ...
Эта конструкция полезна только для единственной цели — преобразования типа исключения. Это же сказано у Саттера по твоей ссылке.
Здравствуйте, AlxB, Вы писали:
А>>Объект то ведь не будет создан в любом случае.
AB>Да конечно, просто мне таким вот путем хотелось узнать почему BClass не создался, потому что в нем что то случилось или AClass "виноват"
Здравствуйте, Михаил Можаев, Вы писали:
ПК>> Это можно сделать и средствами MSVC++6: <...>
ММ> А что делать, если виноват конструктор копирования AClass ?
"Это" != "Все"
Posted via RSDN NNTP Server 1.4.6 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен