Текущий архив: 2009.05.24;
Скачать: CL | DM;
Вниз
Re-raise исключений Найти похожие ветки
← →
Rouse_ © (2009-03-19 09:58) [40]А я бы переписал всю конструкцию...
ну или уволил бы разработчика, умудрившегося написать код, который два раза подряд может влететь в исключение...
← →
It's not me (2009-03-19 11:54) [41]Удалено модератором
Примечание: Не в пивной.
← →
It's not me (2009-03-19 12:10) [42]
> А я бы переписал всю конструкцию...
> ну или уволил бы разработчика, умудрившегося написать код,
> который два раза подряд может влететь в исключение...
Саш, извини, но ты глупость сейчас сказал.
Что значит два раза подряд влететь в исключение? Исключение лишь один из способов считай возврата ошибочного результата работы. Поэтому нужно всего лишь вызвать два раза подряд функции / методы, которые ошибку возвращают методами исключений. И тут от тебя ничего не зависит. Возвращают код ошибки - значит используешь обработку кода ошибок. Возвращают исключения - придется обрабатывать исключения.
← →
Сергей М. © (2009-03-19 12:25) [43]
> хочу выплюнуть во внешний код исключение E1, а не E2 с самого
> начала топика
Ну и хоти себе на здоровье, хоть E1 хоть E2, тем более что ничто не мешает ни хотению ни воплощению хотения)
Но конструктор-то и создание объекта причем тут ?
Можно подумать, что воплощение твоего хотения обязано чем-то отличаться, будь оно не в конструирующем, а в любом другом методе или рег.процедуре/функции)
Типа ты знаешь как это сделать НЕ в конструкторе, но вот как тоже самое сделать В конструкторе - это для тебя проблема)
Чтобы ты перестал упираться рогом, проиллюстрирую твой же вопрос в иной редакции, в которой не фигурируют ни конструктор ни какие-бы то ни было объекты, но которая отражает туже суть безо всякой "шелухи":
Kак возбудить перехваченное исключение E1 ?
Фрагмент кода иллюстрирующего проблему:try
<работаем работаем работаем>
except on E1:EException1 do
try
<Пытаемся исправить ситуацию, вызвавшую исключение E1>;
except on E2:EException2 do
<не получилось...>
<как re-raise"нуть E1?>
end;
end;
← →
It's not me (2009-03-19 12:51) [44]
> Но конструктор-то и создание объекта причем тут ?
а-а-а... Вот к чему ты решил придраться... Да, ты прав, конструктор здесь абсолютно не при чем. В привер я привел конструктор только потому, что лично у меня эта ситуация возникла именно в конструкторе. Прости пожалуйста, что я не полностью абсолютизировал вопрос.
← →
oxffff © (2009-03-19 13:02) [45]
> It"s not me (19.03.09 12:51) [44]
Я честно прочитал формулировку вопроса и у меня нет четкого представления в чем заключается вопрос.
То ли нужно по необработанному вложенному исключению генерировать внешнее, то ли еще что-то?
← →
Сергей М. © (2009-03-19 13:14) [46]Ну и кто из нас после этого "читатель" ?)
Поехали дальше.
У тебя в [0] и E1 и E2 одного и того же класса.
И в то же время в [1]
> информацию о том исключении, которое привело
Так не фиолетово ли какое исключение рерайзить - E1 или E2, если их класс одинаков ?
А если это твой грубый недочет в иллюстрации вопроса, то какого лешего в [7] ты наехал на Test (C), если сам несешь несуразицу ?
Мало того, в [31] неожиданно всплывают серьезные пробелы в элементарных знаниях ..
← →
It's not me (2009-03-19 14:31) [47]
> Так не фиолетово ли какое исключение рерайзить - E1 или
> E2, если их класс одинаков ?
кто тебе сказал, что их класс одинаков?! Указатели используются типа Exception, да, для универсальности, чтобы re-reise"ить любые исключения. Но по факту исключения то могут быть и разного класса совершенно.
Ты ведь понимаешь, что:on E:Exception do
raise E; { <-- НЕСМОТРЯ на указатель типа Exception генерируется исключение все равно того типа, которым было исключение, приведшее к обработке?! }
Кстати, по факту выяснилось, что Плохиш обманул. Так писать как он написал в [6] нельзя. В результате все это приводит к AV по крайней мере при дефолтной обработке.
Я в общем, и подозревал, чтоraise E1
слишком уж просто как-то, поэтому и завел ветку )))
Не приводит к сбоям так, как написал Сергей в [9], за что ему спасибо.
← →
It's not me (2009-03-19 14:37) [48]то есть, правильно писать с ручным использованием AcquireExceptionObject и ReleaseExceptionObject.
Как написал Palladin в [8] (то есть, перегенерирование исключения вне блока обработки исключения) - тоже неверно и приводит к AV.
Все, теперь я ответ установил. Верным в этой ветке был ответ лишь Сергея М. в [9].
← →
It's not me (2009-03-19 14:43) [49]То есть, еще раз подводя итог:
on E:Exception do
raise E;
это далеко не тоже самое, что:on E:Exception do
raise;
Я сам точно не понимаю, надо поразбираться поподробнее будет с исключениями. Так с виду похоже, чтоraise;
это какая-то magic функция. Даже отладчик ведет себя забавно - если поставить наraise;
брекпоинт и нажать F8 - то... Отладчик "перескочит" а точнее останется на этом raise. Только при втором нажатии на F8 пойдет дальше.
← →
Rouse_ © (2009-03-19 15:41) [50]
> on E:Exception do
> raise E;
Эта конструкция приводит к банальному вызову RaiseException, а вот эта:on E:Exception do
raise;
Работает в рамках текущего SEH фрейма, просто передавая управление вышестоящему обработчику.
Страницы: 1 2 вся ветка
Текущий архив: 2009.05.24;
Скачать: CL | DM;
Память: 0.56 MB
Время: 0.014 c