Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
2-1239259013
Askalot
2009-04-09 10:36
2009.05.24
Поворот компонента Image


11-1200620819
Jon
2008-01-18 04:46
2009.05.24
Conversions


15-1237843801
Юрий
2009-03-24 00:30
2009.05.24
С днем рождения ! 24 марта 2009 вторник


6-1203266485
Lamer666
2008-02-17 19:41
2009.05.24
Отправка писем с локальной машины прямо на почтовые ящики


2-1238992979
Верующий
2009-04-06 08:42
2009.05.24
Зарегистрировать свой тип файла