Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Поговорим про исключения |
Автор: Kuvaldis 28.10.2007, 22:59 |
Есть у меня преподаватель, с легкой руки которого мы здесь на нескольких листах рассуждали о строках в С++ НА очереди исключения... Ссылаясь на интервью Хейлсберга - автора С#(правда, я их не нашел), были даны принципы использования исключений, не нарушающих принципы структурного программирования: 1. Все исключения должны иметь общий базовый класс 2. Объекты исключений должны располагаться в динам. памяти. Это камень в сторону С++. Таким образом мы не можем сказать, откуда в общем случае пришло исключение. + многократное копирование по стеку при раскрутке (есть в Страуструпе) 3. В объекте должна быть ссылка на предыдущее исключение в контексте которого возникла данная (так сделано в .NET только c Frammework 2.0 ) 4. Использование исключений для управления ходом работы проги зарещено. (у Страуструпа есть и намеки на такое нецелевое использование) 5. Касается того, что все таки объекты должны быть только динамические -> слова по поводу try... finally (уже обсуждали) 6. Обработка исключений с поглощением допустима лишь на самом верхнем уровне (сюда цикл обработки сообщений и т.д) Скажу так: препод этот очень грамотный, работает как раз на С++, в Check Point (который делает Zone Alarm и т.д.) Т.е. в компетентности его сомневаться не приходится. Но сам он дельфист. В общем, хотелось бы услышать ваше мнение, дорогие форумчане ![]() СУВ, Kuvaldis |
Автор: Kuvaldis 28.10.2007, 23:45 | ||||
archimed7592,
Честно говоря, я это и хотел в интервью найти, но не нашел. :( Не знаю, просветить не успели, так как пара закончилась Но эту фичу можно и не юзать (ссылка 0 )
имелось в виду throw; // повторная генерация |
Автор: marcusmae 28.10.2007, 23:46 | ||||||||
Нда, это в целом очень напоминает .NET-овые исключения : базовый класс Exception, исключения хранят ссылки на дерево вложенных исключений, приведших к данному, хранят трассу вызовов, в связи с чем не очень понятно утверждение о том, что
помимо это специализируются (например, ArgumentException в числе прочего указывает на имя аргумента). С одной стороны, подход грамотный при разработке больших и/или устойчивых, защищённых программ. Надстройка над C#, SpeC# форсирует проработку исключений введением контрактов на вызовы, например :
С другой стороны, невполне ясно, какое это может найти выражение в плюсах, где исключения есть, но их поддержка намного слабее.
Хм, а по-моему, практикуется. Допустим, если какой-то catch-блок несумел обработать исключение, то он пробрасывает его вверх более общим обработчикам, а если сумел, то "проглотил" ошибку, и программа поехала себе дальше. Чем не управление? Добавлено через 14 минут и 29 секунд
Ха-ха ![]() Не считаю свой мозг совсем уж проеденым, все больше и больше отхожу от .NET к плюсам, и чувствую себя в них намного комфортнее ![]() |
Автор: Lazin 29.10.2007, 09:26 | ||||
Иногда бывает так, что хрен поймешь как ошибку обрабатывать, как например обработать ошибку доступа. Такие ошибки приводят к тому что программа падает, причем у клиента. А система обработки исключений, в этом случае должна помочь разработчикам сего глюкалова понять из-за чего это происходит, т-есть получить информацию о контексте выполнения программы в этот момент. |
Автор: archimed7592 29.10.2007, 10:02 | ||||
Да чего юзать или нет это вопрос десятый ![]() Я не понимаю зачем нужна ссылка на какое-то мифическое предыдущее исключение(по какому принципу они хоть упорядычиваются? какое предыдущее, а какое следующее? ![]() Гхм... Опять я тебя не понимаю: давай на пальцах, что подразумевалось под исходным утверждением и при чём здесь rethrow?
А можно конструктивно: что понимается под слабой поддержкой исключений и чем С++ в этом плане слабже .net'а?
Ну, скажем, в том же .net "мощная система исключений" позволяет полностью узнать контекст, IIRC, только в отладочном режиме. Опять же, что понимается под "должна помочь разработчикам сего глюкалова понять из-за чего это происходит, т-есть получить информацию о контексте выполнения программы в этот момент." - на пальцах(на примерах). |
Автор: MAKCim 29.10.2007, 10:09 | ||
я ни в коем случае не сторонник .NET но мне кажется управляемый код априорно более гибок (но не быстр естественно) во всех отношениях (и в плане исключений в частности) динамическое формирование кода, перекомпиляция в run-time и все такое |
Автор: archimed7592 29.10.2007, 10:17 | ||
Типа, отмазался ![]()
В априоре гибком коде возможно RAII? Или может быть там возможны такие же мощные(читай compile-time) шаблоны? Список можно продолжить ![]() Рефлексия? Да ну её... Ну вот ты хоть раз динамически чего-нибудь формировал? ![]() Речь про JIT? А в чём плюсы этого подхода(кроме мифической кроссплатформенности)? |
Автор: griker 29.10.2007, 10:33 |
Да ладно чуваки... Расслабтесь посмотрите какой - нибудь фильм... А потом на свежую голову сядете за комп |
Автор: MAKCim 29.10.2007, 10:34 | ||||||
нет, не только в кроссплатформенности допустим есть некоторый код, который постоянно выполняется (какой-нибудь сервер) виртуальная машина (CLR, JRE) в зависимости от внешних факторов (например какая-либо ветвь кода выполняется только в 5% всех случаев) может перекомпилировать (=оптимизировать) код с их учетом
ну согласись, это тоже не аргумент я лично вообще особо с .NET/Java не работал, с Reflection тем более но это же не означает, что она бесполезна
опять таки, в С++ compile-time шаблоны, в .NET run-time и что? это ортогональные понятия с другой стороны, модифицировав компилятор какого-либо языка .NET, можно получить те же мощные compile-time шаблоны а вот обратное не верно (т. е какую-либо фишку .NET легко портировать в С++) что я так .NET защищаю ![]() ![]() Добавлено через 4 минуты и 8 секунд кроссплатформенность то настоящая тут просто много других причин (это про .NET) ну а Java реально кроссплатформенна |
Автор: archimed7592 29.10.2007, 10:40 | ||||||||
Опять же - мифическая возможность ![]() Реальные JIT'ы так делают? Сомневаюсь.
Ну почти бесполезна ![]() Она помогает, дизайнеру, к примеру, узнать какие есть свойства у компонента(пользовательского). Мы где-то на исходниках холиварили на тему применимости рефлексии - ничего убедительного в пользу рефлексии сказанно не было.
Опять таки: ты знаком с тем, как реализуются run-time шаблоны в .net? ![]() По идее, то же самое можно сделать в С++ с помощью интерфейсов и обыновенных(нешаблонных) классов ![]() Добавлено через 2 минуты и 35 секунд griker, ты по моему перепутал тематику с флеймом.
Хорошо, С++ тоже кроссплатформеный ![]() ![]() |
Автор: MAKCim 29.10.2007, 10:50 | ||||
я слышал от компетентного источника, что JVM так делает ничего другого сказать не могу вообще мы говорим о реализациях концепции управляемого кода или о самой концепции? ![]()
тут надо какого-нибудь авторитетного человека, который хорошо знаком с .NET например http://forum.vingrad.ru/index.php?showuser=777&nickname=Aldan Добавлено через 2 минуты и 10 секунд
![]() только типы кроссплатформенности разные |
Автор: Lazin 29.10.2007, 11:18 | ||
Я бы хотел напомнить что тема называется: Поговорим про исключения
Видел когданибудь в ХР окошко с сообщением: "Программа выполнила недопустимую инструкцию и будет закрыта, бла-бла-бла..." - так-вот это поведение по умолчанию при возникновении необработанного исключения, и его можно переопределить. Например можно предложить пользователю послать отчет об ошибке разработчикам. |
Автор: archimed7592 29.10.2007, 11:24 | ||||
Да что там - Макс главный флудогон этого раздела ![]()
Видел. К чему всё это? К тому что бывают исключения про которые "забыли"? И то, что в этом случае помогут ссылки на "предыдущие" исключения? Хорошо, допустим... Осталось понять как они помогут и по какому принципу они предыдущие и следующие? |
Автор: MAKCim 29.10.2007, 11:39 | ||
а никто и не забывал, высказывайтесь ![]() конструктивный спор, логически связанный с предметом основного обсуждения, вполне уместен |
Автор: Alexeis 29.10.2007, 11:47 | ||
Ребят, а вот насчет вложенных исключений. В можно ли в С++ защищенные секции вкладывать друг в друга? Чтобы отрабатывать корректно исключения. Например в делфях я могу написать так
|
Автор: Lazin 29.10.2007, 12:41 | ||||||
А что произойдет, например, при обращении к уже удаленному объекту, из-за какой-нибудь ошибки. Даже если ты знаешь как это событие перехватить, то как потом его обрабатывать? Единственный вменяемый способ - не обрабатывать такое исключение, а пропустить его, чтоб оно дошло до самого до main-a ![]()
Вложенные исключения нужны для того что-бы определить первоначальный источник исключения, наверное:
разница в том, что исключение сохраняет информацию о всех обработчиках, в которых оно было перехвачено вам оно надо, мне лично нет |
Автор: archimed7592 29.10.2007, 12:46 | ||||||
Да, конечно.
Ну эт очевидно, по моему ![]()
Мне тоже не надо ![]() |
Автор: Lazin 29.10.2007, 12:47 | ||
Можно, но только возможностей немного больше, в этом-то и проблема, возможностей дофига, и пользоваться ими можно поразному, но не все из того что можно есть гут |
Автор: akizelokro 29.10.2007, 15:51 |
Возвращаясь к заявленной теме. В идеале каждую программу нужно делать как отказоустойчивую. На практике этого добиться не удается очень часто ( читай, - практически всегда). Но есть программы с требованиями повышенной "плавучести". В идеале, С++ должен предоставить для программиста соответствующие возможности. С наиболее простым вариантом - одиночным исключением все понятно. Исключение возбуждено, обработчик перехватил его, обработал, принял "соответствующие" меры и передал управление в программу (без аварийного завершения). Но, посмотрим, как все может произойти (обязательно произойдет) на практике. В блоке try - catch исключение. Прежде чем оно передается в блок catch(ESomeExceprion e), освобождаются локальные переменные. Для объектов вызываются их деструкторы. Я могу прописать в деструктор некоего объекта дополнительные действия помимо освобождения памяти. Например, возвращая контекст некоего устройства в прежнее состояние. Что происходит с обработкой предыдущего исключения, если в этот момент возбуждается новое? |
Автор: archimed7592 29.10.2007, 16:00 | ||
Вызывается std::terminate(), который в свою очередь std::abort(). Добавлено через 1 минуту и 34 секунды Так что про "старое" исключение можно забыть, как и про всю программу. Читаем классиков: деструктор не должен выпускать исключений! |
Автор: Alexeis 29.10.2007, 16:03 | ||
ИМХО зависит от самого блока catch, прежнее прервется, обработается новое, если нет своего перехватчика, то обработка предыдущего должна прерваться, если есть то продолжиться после окончания вложенного перехватчика. |
Автор: archimed7592 29.10.2007, 16:05 |
Alexeis, читай выше - если во время отмотки стека вывалится ещё одно исключение, то вывалится вся прога. |
Автор: Alexeis 29.10.2007, 16:16 |
archimed7592, если внутри catch сделать еще одну защищенную секцию, дальше если внутри этой вложенной секции опять возникнет исключение, что неужели не сработает catch это вложенной секции? |
Автор: akizelokro 29.10.2007, 16:23 | ||
Здесь мне не все ясно. В книгах описания ситуации я не встречал. Но судя по принципам обработки, в этом случае получается ерунда. Второе исключение возбуждено в пределах try{}, оно "пропиливает" стэк, продолжая освобождать еще не освобожденные локальные объекты. После раскрутки стэка и перехвата исключения выполнение программы должно по идее перейти к следующей за try-catch блоком инструкции. Если же программа возвращается к обработке первичного исключения, то (предположу), что вновь будет предпринята попытка "раскрутки" стэка с непредсказуемыми последствиями ![]() Также, где хранится "значение" для первичного исключения? В вершине стэка? Это я рассматриваю тот случай, когда на каждое из двух исключений есть свой обработчик, не завершающий выполнение программы. Либо catch(...) не отфутболивает с помощью throw() исключение по цепочке. |
Автор: archimed7592 29.10.2007, 16:42 | ||||||
На примере понятней будет?
Добавлено через 3 минуты и 2 секунды Тебе цитату из стандарта привести, где написано что будет, если во время раскрутки стека вывалится исключение? Чё демагогию разводить то? |
Автор: akizelokro 29.10.2007, 16:51 | ||
Приведи. Я еще учебник не одолел, так что мне стандарт штудировать еще рано. А учитывая количество литературы, в которой я закопался, и то, что мою работу с меня никто не снимал, просто нет времени. ![]() |
Автор: Alexeis 29.10.2007, 16:54 | ||
archimed7592, я не вижу чтобы строчка Была в защищенной секции... Добавлено через 1 минуту и 36 секунд типа такого
вот тогда что произойдет? |
Автор: Lazin 29.10.2007, 17:00 | ||||
Возможно Alexeis, имел ввиду следующее:
млин, он меня опередил 0_o |
Автор: JackYF 29.10.2007, 17:01 |
если здесь возникнет исключение, тогда std::terminate(). |
Автор: archimed7592 29.10.2007, 17:03 | ||||||||||
Стандарт штудировать не обязательно... IIRC об этом же подробно написано у Мейрса.
И тем не менее ты находишь время, получив ответ, проигнорировать его и пофантазировать что будет "если бы, да кабы"... Добавлено через 1 минуту и 39 секунд
Какая разница, если до неё выполнение даже не дойдёт ![]() Добавлено через 3 минуты и 32 секунды
Добавлено через 4 минуты и 34 секунды А что ещё может произойти, если ошибка произошла в самом механизме обработки ошибок? 0_о В Дельфи такого понятия нет, ибо там нет понятия "автоматический объект", как и нет RAII. Добавлено через 6 минут и 3 секунды Ну с этим всё понятно - а что, в Delphi вложенные блоки обрабатываются как-то иначе? |
Автор: archimed7592 29.10.2007, 17:20 | ||||
Вообще говоря, выполнение в блоке catch отличается от выполнения вне блока catch только тем, что внутри catch поведение инструкции throw; имеет предсказуемый результат. Даже в таких, немного извращённых, случаях:
|
Автор: Alexeis 29.10.2007, 17:49 | ||
Да я с исключениями знаком поверхностно. Примерно знаю как их юзать и все, как оно там внутри не вникал. Однако я ничего не слышал про то что внутри блока обработки нельзя вызывать другое исключение... |
Автор: archimed7592 29.10.2007, 20:27 | ||
Внутри блока можно ![]() Когда генерируется исключение, все автоматические объекты из данной области видимости уничтожаются(называются отмоткой стека). Под уничтожением понимается отработка деструкторов. Это происходит ДО входа в блок catch. Т.о., если во время этой отмотки стека из одного из деструкторов вывалится исключение(наружу), то сработает terminate, поведение которого по умолчанию - abort(abnormal termination). |
Автор: Alexeis 29.10.2007, 21:50 | ||
Т.е. уничтожаются все статические объекты объявленные в этом блоке (в блоке try)? |
Автор: archimed7592 29.10.2007, 22:07 | ||||||
Не статические, а автоматические ![]() И не только те, что объявлены в этом блоке, но во всех других блоках видимости, которые покидает исключение по пути к своему обработчику.
Обрати внимание, что уничтожается не только 7, но 4, 3, ибо их область видимости тоже заканчивается во время проброса исключения и, соответственно, отмотки стека. Добавлено через 2 минуты и 19 секунд На принципе отмотки стека и основан RAII - это замена вашему finally(вместо него деструктор)... Только вот finally можно забыть написать, а деструктор автоматического объекта вызовется автоматически по выходу из области видимости ![]() |
Автор: Alexeis 29.10.2007, 22:30 | ||
Ну это и так очевидно, ведь происходит выход из блока. Все что создано в блоке уничтожается по выходу из него вне зависимости от того каким образом из него вышли. Странно если бы такого не было... |
Автор: Alexeis 29.10.2007, 22:55 | ||
В делфях все не так работает. Если возникает исключение, то обработка происходит внутри текущего блока. Он как бы изолирован и не видит внешнего блока. Только если исключение будет в самой обработке, тогда вызовется внешний обработчик. Для блока Try может быть только 1 except или 1 finally (но не одновременно) Пример
Сначала сработает finally, но сообщение 'выполнился finally' не выйдет, так как сгенериться AV и только в этом случае выполниться except. Обработка разных типов исключений определяется в рамках одного блока, т.е. в данном случае "on EDivByZero do showmessage('выполнился EDivByZero');" никогда не выполниться потому, что исключение EDivByZero считается уже отработанным в блоке finally. Т.е. схема более простая и прозрачная. Ну про статические объекты говорить тут нечего, так как их попросту нет, да и вообще в блоках нельзя объявлять переменные, потому они будут существовать до конца работы функции. |
Автор: akizelokro 31.10.2007, 10:48 | ||
За ответ спасибо. За ссылку на Мейерса тоже, но чтить его буду после одоления текущего учебника. Иными словами, если во время раскрутки стека возбуждается второе исключение, то программа падает, а я теряю контроль над своим кодом, даже если казалось бы делаю все правильно. Неприятно. Вот и ответ автору темы на его поставленные вопросы (большинство из них). |
Автор: archimed7592 31.10.2007, 11:13 |
А что ты понимаешь под словами "делаю всё правильно"? Грубо говоря, зачем выпускать исключение из деструктора можешь объяснить? Ты же потом уже не сможешь уничтожить объект "до конца". |
Автор: akizelokro 31.10.2007, 11:23 | ||
я говорю про то, что если при раскрутке стека уничтожается локальный объект с деструктором вида
или с деструктором в функциональном виде, то даже несмотря на наличие обработки исключения, на которую я надеюсь, программа все равно отрубится. Согласно стандарту. Для динамических объектов это не так. |
Автор: UnrealMan 31.10.2007, 11:56 | ||
Неправда. В C++ одновременно может быть хоть сто необработанных исключений. Если их вовремя ловить, то программа будет вполне себе благополучно работать. |
Автор: bsa 31.10.2007, 12:23 | ||||||||
В данном случае код вполне легальный. Программа убивается через std::terminate(), когда исключение выходит за пределы деструктора!!!! т.е.
Добавлено через 2 минуты и 26 секунд В данном примере, в деструкторе класса B было кинуто исключения типа const char *, а catch стоял только на исключения типа int. В итоге, исключение вышло из пределов деструктора, а так как деструктор не закончил выполнение, была вызвана std::terminate(). |
Автор: akizelokro 31.10.2007, 12:59 |
Код правильный, но не о том. С самого начала рассматривается ситуация, когда возбуждено исключение, назовем его первичным. Происходит раскрутка стека, и в ходе этой раскрутки стека идет второе исключение при уничтожении локального объекта (в деструкторе). Стандарт гласит (если мой перевод верен), что в этом случае программа вызовет функцию terminate (до или после обработки вторичного исключения - уже не так важно). И это будет даже когда логика деструктора не подразумевает прекращения дальнейшего выполнения программы и возникшее в деструкторе исключение в том же самом деструкторе должно без лишнего шума обработаться. В твоем же коде идет обычная обработка двух невложенных исключений. |
Автор: akizelokro 31.10.2007, 13:29 | ||
Кстати, такой код
в МSVC++ 6 добрался до благополучного завершения. Хмык, нужно садиться за английский. |
Автор: Fazil6 31.10.2007, 14:28 | ||||||||
потому, что все исключения обработаны коректно.
нет. При раскрутке стека и уничтожении обектов вполне допускаются исключения. terminate вызовется только если у тебя получится на руках больше одного необработаного исключения, т.е. если какие-то иключения небудут вовремя обработаны.
сразу 2 исключения, а это уже папандос... |
Автор: archimed7592 31.10.2007, 14:35 |
Думаю стоит начать с русского: я не один раз упомянул о том, что для terminate исключение должно вывалиться из деструктора(наружу). Фантазируй поменьше и читай повнимательней. |
Автор: akizelokro 31.10.2007, 15:30 | ||||
C учетом того, что эксперты иной раз у нас да лопухнутся (ничего личного), я все-таки предпочитаю верить более надежным источникам. Если "exits using an exception" означает "вывалиться из деструктора(наружу)", то приношу свои извинения за назойливость. |
Автор: archimed7592 31.10.2007, 15:35 | ||
Ок. Как можно выйти из ф-ции(коей деструктор тоже является)? Либо return, либо исключение. Здесь упомянут только второй вариант(выходит из деструктора из-за [неперехваченного] исключения). Извинения принимаются, но будь любезен быть немного повнимательней, а если не знаешь английский, то верь наслово русскоговорящим "экспертам, которые лопухаются". |
Автор: bsa 31.10.2007, 18:41 | ||
Все одновременно вряд ли. Обычно, один глупость сморозит другие поправят. А когда все в один голос говорят одно и тоже, но разными словами, то не верить не стоит. ![]() |
Автор: akizelokro 1.11.2007, 08:14 | ||
Иными словами, у стандарта совсем не дружелюбный интерфейс). "unhandled" в упомянутой строке нет, а в предыдущей есть.
А сам виноват. Отсылаешь меня к стандарту, когда я говорю, что мне еще рано за него садиться. В неправильном переводе меня не поправил. Пример дал не тот. Вообщем, пока я сам не накорябал соответствующий пример и не прогнал его на двух разных компилерах и таким образом получил ответ на свои вопросы, только тогда эксперты проснулись. Все равно спасибо, но я лишний раз убедился, что в сложных (для меня) вопросах нужно брать самому и компиляться. |
Автор: archimed7592 1.11.2007, 08:34 | ||||||||
Извините пожалста, а как можно выйти из ф-ции из-за обработанного исключения? Прошу у тебя прощения, если ты действительно считаешь, что я в чём-то виноват.
Я перед этим черным по белому написал об этом, просто упомянув, что это указано в стандарте. Да что ты говоришь? А http://forum.vingrad.ru/index.php?showtopic=179330&view=findpost&p=1300856 ты типа не заметил...
Бывают же такие неблагодарные создания... Вот если я чего-то не знаю - да я сто раз спасибо скажу, если меня чему-то научат(и буду совершенно искреннен). А ты всё выставишь так, будто тут все тебе обязаны и вообще, ты тут самый умный, просто на время "забыл" о чём идёт речь. Твоё конечно дело, но, блин, начинает раздражать(не первый топик в которым ты себя так ведёшь).
Угу. Только не компиляться, а разбираться. |
Автор: MAKCim 1.11.2007, 09:46 | ||
компилятор - не панацея т. е результат он даст, но где гарантия, что он правильный? ![]() |
Автор: akizelokro 1.11.2007, 10:05 | ||
Не надо мне мозги пудрить. Я тебе черным по белому писал, что исключение будет обрабатываться внутри деструктора. К тому же ты, как я смотрю, выбираешь довольно простые и удобные для себя аргументы (что имеет право на существование, но сомнительно для меня, - я даже простецкие, но принципиальные по логике ошибки не редактирую и оставляю, чтобы не чваниться,- хотя они мне и становятся видны через 5 минут после отправки мессаджа). Небольшое усложнение кода
, где деструктор находится в функциональном блоке try-catch. Этот код не компилится под MSVC++ 6 и BDS2006. мне удалось прокомпилить его под MSVS 2008 Beta2. Здесь действительно программа выходит из деструктора по исключению, даже несмотря на то, что исключение обрабатывается в деструкторе. В предыдущих твоих примерах программа могла выходить из деструктора только при необработанном исключении (есть разница). Сейчас terminate() вызывается. Здесь возможны два варианта: -Beta версия и есть Beta версия -генерировать исключения в деструкторах не рекомендуется (но это вообще другая песня). Пока что я считаю исключения одним из самых муторных разделов C++ (моя субъективная оценка). К теме экспертов и их уровня возвращаться не хочу. Просто просьба прокомпилить код под другим компилером и ткнуть мне в нос результаты. |
Автор: Fazil6 1.11.2007, 10:37 | ||||
хм... А разве такой синтаксис допустим в С++ ??? ![]()
нет ничего необычного в исключениях в деструкторе. можно их там и генерить и использовать. Выпускать их из деструктора нерекомендуется Добавлено через 1 минуту и 11 секунд
какие результаты? исправь ошибку синтаксиса и все нормально работает в твоем примере |
Автор: Daevaorn 1.11.2007, 10:44 |
да |
Автор: Daevaorn 1.11.2007, 11:05 | ||||
читаем внимательно http://www.kuzbass.ru/docs/isocpp/except.html#except.handle
а ты нам не пудри!
весь в тебя PS: akizelokro,совет остается в силе! |
Автор: UnrealMan 1.11.2007, 11:20 | ||||||
Вот такие два варианта кода
это не одно и то же. В первом случае function-try-block, во втором - обычный try-block. И применительно к деструктору поведение получается разным. |
Автор: akizelokro 1.11.2007, 11:48 | ||||||
Угу. В твоем первом случае согласно цитате из стандарта, приведенной комодератором (если я опять "неправильно" перевел ![]()
в которой не указывается явно "unhandled", но есть "exits". Сорри, мне просто нужно сдавать тест, а на предварилке я по исключениям очень крупно влетел. Вот и пытаюсь хоть таким образом переварить кашу из исключений, которая заварилась у меня в голове ![]()
Во-первых, не совет, а официальное предупреждение от комодератора в личной переписке и в сообщении с очень "деликатно оформленной" темой. Я помню ![]() Жду, когда замодерируют. Жаловаться не буду. |
Автор: archimed7592 2.11.2007, 00:39 | ||||||||||||
А за базар то придётся ответить ![]() Ткни пальцем, где ты об этом написал.
![]() Ещё раз для тех кто в танке: как можно выйти из ф-ции, используя перехваченное исключение(не return)? Приведёшь пример, получишь миллион плюсов в репу, лично моё наиглубочайшее уважение, а также, сможешь рассказывать внукам "я нашёл опечатку в стандарте и её исправили". Это очень важный(в частности для твоего понимания "самого муторного раздела С++") вопрос в этом споре. Как только ты на него ответишь, так сразу у тебя отпадут все, задаваемые тобой в этом топике вопросы.
Ты считаешь нормальным вызывать негативное мнение о тебе у других участников форума только ради того, чтобы сдать какой-то там тест? А ну ка, эксперты, поднапряглись и быстро всё ему объяснили - его величеству нужно тест сдавать! ![]() Daevaorn, MAKCim, давно ли это(и зачем) вас понизили до комодов? 0_о |
Автор: MAKCim 2.11.2007, 09:44 |
archimed7592, если интересно, в ЛС |
Автор: Lazin 2.11.2007, 10:19 | ||
разве не так? если в try блоке происходит исключение, оно перехватывается блоком catch, и затем происходит выход из деструктора, но не через return. |
Автор: Daevaorn 2.11.2007, 10:23 | ||
оно rethrown |
Автор: archimed7592 2.11.2007, 10:35 |
А через throw; . Т.е. появляется другое исключение, которое уже не перехвачено. Добавлено через 54 секунды Это точно так же, как в случае, если ты в конце деструктора не написал return; - оно "напишется" за тебя. |