Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

проблема с try ... except   Найти похожие ветки 

 
Polkan   (2005-01-22 18:13) [0]

Здравствуйте.

Помогите разобраться с проблемой, пожалуйста. Никак не пойму, в чем дело.

Код:
procedure qwe;
begin
 try
   Checked := ReadBool("DeleteBadsOnExit");
 except
   on ERegistryException do
     WriteInteger("DeleteBadsOnExit", 0);
 end;
end;

Проблема в том, что после возникновения exception программа вылетает из процедуры вместо того, чтобы идти в except block.
Никак не могу понять этой проблемы. Уже пробовал создавать новое приложение для проверки. Не работает по той же проблеме.

Спасибо за внимание.


 
begin...end ©   (2005-01-22 18:21) [1]

> Polkan   (22.01.05 18:13)

Ну, во-первых, Вы программу из Delphi запускаете? А во-вторых, обязательно ли вохникает исключение указанного класса?


 
Piter ©   (2005-01-22 18:21) [2]

Ну значит блин вызывается исключение НЕ ERegistryException


 
Polkan   (2005-01-22 19:03) [3]

В том-то и дело, что в дебаге при выполнении строчки ReadBool("DeleteBadsOnExit") вылетает исключение (и так и должно быть) ERegistryException "Failed to get data for моя переменная".

Исключение генерируется закономерно, поскольку такого ключа в реестре на самом деле нет, но дело не в этом - мне интересно, почему конструкция try ... except не работает, почему после той злосчастной операции программа просто вылетает из процедуры?


 
Piter ©   (2005-01-22 19:04) [4]

ты дебагером отлаживал?


 
Polkan   (2005-01-22 19:07) [5]

Я этим и занимаюсь в настоящее время.


 
begin...end ©   (2005-01-22 19:08) [6]

> [5] Polkan   (22.01.05 19:07)

Для начала уберите флажок Tools -> Debugger Options -> Language Exceptions -> Stop on Delphi Exceptions.


 
Polkan   (2005-01-22 19:30) [7]

>begin...end
Вопрос решился.

Спасибо большое за флажок )

Но мне непонятно все-таки, почему до этого момента при включенном флажке у меня дебаггер все-таки входил в блок except.


 
Polkan   (2005-01-22 19:36) [8]

Оказалось, что ничего не решилось. Ступил я.
Вопрос в силе. (


 
Piter ©   (2005-01-22 19:41) [9]

поставть брекпоинт на строчке:

Checked := ReadBool("DeleteBadsOnExit");

И когда дойдет до этой строчки трассируй по F8.

И прямо здесь говори так: "Нажал F8, ничего не произошло, курсор перешел на такую то строчку. Нажал еще раз F8 - произошло то-то, курсор перешел на такую-то строчку, нажал опять F8..." и т.д.


 
Polkan   (2005-01-22 19:52) [10]

Объясняю...

Дохожу до строчки с readbool"ом.
Нажимаю F8 и все! Вот он родимый ERegistryException.
Далее Ок и F8. Компилятор посчитал, что дальше процедуру не стоит продолжать и вышел из процедуры вообще.


 
Knight ©   (2005-01-22 19:52) [11]

Я не понял... это урезанная процедура или ты обращаешься к своей функции ReadBool в которой и производишь чтение?


 
novice__man   (2005-01-22 19:53) [12]

Было у меня такое. Если нет ветки в реестре, то при попытке открыть или проверить (OpenKey, OpenKeyReadOnly, KeyExists) вылетало исключение, которое не попадало в секцию except end;
Лекарство не найдено :(.
Ветка обсуждения: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=27577

Delphi6 WindowsXP.


 
Knight ©   (2005-01-22 19:59) [13]

Дай в студию ReadBool...


 
Knight ©   (2005-01-22 20:01) [14]

Что-то мне говорит, что ERegistryException возникает именно в ней и к вышеописанной процедуре отношения не имеет...


 
Leonid Troyanovsky ©   (2005-01-22 20:13) [15]


> Polkan   (22.01.05 19:52) [10]

> Дохожу до строчки с readbool"ом.
> Нажимаю F8 и все! Вот он родимый ERegistryException.


В твоем обработчике вызывается WriteInteger(Integer?),
что чревато новым исключением при ненадлежащем Access.

--
Regards, LVT.


 
Knight ©   (2005-01-22 20:15) [16]


> [10] Polkan   (22.01.05 19:52)
> Дохожу до строчки с readbool"ом.
> Нажимаю F8 и все! Вот он родимый ERegistryException.

Жми не F8, а F7...


 
Piter ©   (2005-01-22 21:33) [17]

Polkan   (22.01.05 19:52) [10]
Нажимаю F8 и все! Вот он родимый ERegistryException.


это понятно

Далее Ок

понятно

Polkan   (22.01.05 19:52) [10]
и F8. Компилятор посчитал, что дальше процедуру не стоит продолжать и вышел из процедуры вообще


Вот ты нажал Ok, нажал F8 - на какой строчке оказался курсор? Я ведь просил подробно.

Какая у тебя версияDelphi?

Knight ©   (22.01.05 20:01) [14]
Что-то мне говорит, что ERegistryException возникает именно в ней и к вышеописанной процедуре отношения не имеет...


кстати, да. Рыцарь, видать, прав. Попробуй нажать не F8, а F7 - войди в функцию ReadBool, посмотри ГДЕ ТАМ ПРОИСХОДИТ ИСКЛЮЧЕНИЕ? Вероятно, это исключение "гасится" в недрах ReadBool, поэтому и не вылезает наружу, при этом в IDE ты это исключение, конечно, видишь.


 
Polkan   (2005-01-23 03:04) [18]

Процедура обрезанная. Это вариант использования TRegistry.

>Leonid Troynovsky
Мне, честно говоря, по барабану, вызовет ли WriteInteger исключение или нет. Мне другое важно.

>Ко всем
В процедуре ReadBool исключение возникает ЗАКОНОМЕРНО! так и должно быть. Дело в другом. Мне непонятно, почему возникшее в ReadBool исключение заставляет компилятор вываливаться из процедуры, а не идти в except. Ладно, может быть, так и должно быть, поскольку исключение все-таки вываливается в ReadBool (Use Debug DCUs используется по назначению).
Короче, видимо накосячил я. Но теперь вот в чем дело... Как от этого избавиться? Наследовать от TRegistry и переписывать ReadBool, чтобы обработать исключение именно там, где оно возникает, или вообще использовать WinAPI? Я так и играю... Это глупо. И глупо более всего поведение классов, написанных Borland. В общем, я знаю, как решить эту проблему, но тупыми способами, и знаю, как обойти эту проблему бочком, но это уход от проблемы. Может, кто-нибудь еще что-то может посоветовать?

С уважением.


 
GuAV ©   (2005-01-23 03:09) [19]

Может всё-таки не в самой процедуре дело ?
Можете выложить минимальное тестовое приложение полностью ?


 
Anatoly Podgoretsky ©   (2005-01-23 03:17) [20]

Polkan   (23.01.05 03:04) [18]
Тебе по барабану, а системе нет, замени эту строчку на ShowMessage и снова проверь.


 
Defunct ©   (2005-01-23 04:35) [21]

Странно однако.

давайте порассуждаем, какое исключение может произойти на строчке:

 Checked := ReadBool("DeleteBadsOnExit");

варианта 2,
1. AV если checked - указатель в никуда на boolean.
2. ERE если читаем несуществующий ключ.

ну теперь порассуждаем дальше, что такое ERE - а черт его знает, какое-то синтетическое исключение, генерируемое классом TRegistry. Так может в нем и проблема? Что ж, создаем локальную переменную Checked чтобы исключить AV и смотрим будет ли работать все должным образом.

procedure TForm1.Button2Click(Sender: TObject);
var
 Checked : boolean;
 R       : TRegistry;
begin
 R := TRegistry.Create;
 try
    try
       Checked := R.ReadBool("ÀNetTakogoKlucha")
    except
       ShowMessage("I pravda net")
    end
 finally
    R.Free
 end
end;

и, о чудо! Except блок отрабатывает.


 
Defunct ©   (2005-01-23 04:38) [22]

PS: Я так понимаю, ReadBool Вы сделали свой, исключите из собственного ReadBool обработку исключений, тогда проблема пропадет.



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.024 c
1-1106418295
MadGhost
2005-01-22 21:24
2005.02.06
Как динамически создать на форме TLabel TEdit и другие компоненты


1-1106521601
ninja
2005-01-24 02:06
2005.02.06
прокрутка StringGrid


6-1100779711
Damage
2004-11-18 15:08
2005.02.06
фильтр HTML перед браузером


9-1099502958
FRick
2004-11-03 20:29
2005.02.06
GLScene + скрипты!


3-1104824144
tytus
2005-01-04 10:35
2005.02.06
Фильтрация данных.