Главная страница
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
4-1210156637
A.L.E.X.A.N.D.E.R.
2008-05-07 14:37
2009.05.24
Создание процесса от имени системы .


3-1221206642
KirillRepin
2008-09-12 12:04
2009.05.24
добавление рисунка в БД из файла


2-1239007118
@!!ex
2009-04-06 12:38
2009.05.24
StringReplace не работает с длинными строками?


15-1237488048
KSergey
2009-03-19 21:40
2009.05.24
Запуск программы под другой уетной записью


15-1237840569
alexander-rsh
2009-03-23 23:36
2009.05.24
Медиаплеер