![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проблема с try ... except
Polkan © (2005-01-22 18:13:00)Здравствуйте.
Помогите разобраться с проблемой, пожалуйста. Никак не пойму, в чем дело.
Код:
procedure qwe;
begin
try
Checked := ReadBool('DeleteBadsOnExit');
except
on ERegistryException do
WriteInteger('DeleteBadsOnExit', 0);
end;
end;
Проблема в том, что после возникновения exception программа вылетает из процедуры вместо того, чтобы идти в except block.
Никак не могу понять этой проблемы. Уже пробовал создавать новое приложение для проверки. Не работает по той же проблеме.
Спасибо за внимание.
Defunct (2005-01-23 04:38:00) [1]PS: Я так понимаю, ReadBool Вы сделали свой, исключите из собственного ReadBool обработку исключений, тогда проблема пропадет.
Defunct (2005-01-23 04:35:00) [2]Странно однако.
давайте порассуждаем, какое исключение может произойти на строчке:
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 блок отрабатывает.
Anatoly Podgoretsky (2005-01-23 03:17:00) [3]Polkan (23.01.05 03:04) [18]
Тебе по барабану, а системе нет, замени эту строчку на ShowMessage и снова проверь.
GuAV (2005-01-23 03:09:00) [4]Может всё-таки не в самой процедуре дело ?
Можете выложить минимальное тестовое приложение полностью ?
Polkan (2005-01-23 03:04:00) [5]Процедура обрезанная. Это вариант использования TRegistry.
>Leonid Troynovsky
Мне, честно говоря, по барабану, вызовет ли WriteInteger исключение или нет. Мне другое важно.
>Ко всем
В процедуре ReadBool исключение возникает ЗАКОНОМЕРНО! так и должно быть. Дело в другом. Мне непонятно, почему возникшее в ReadBool исключение заставляет компилятор вываливаться из процедуры, а не идти в except. Ладно, может быть, так и должно быть, поскольку исключение все-таки вываливается в ReadBool (Use Debug DCUs используется по назначению).
Короче, видимо накосячил я. Но теперь вот в чем дело... Как от этого избавиться? Наследовать от TRegistry и переписывать ReadBool, чтобы обработать исключение именно там, где оно возникает, или вообще использовать WinAPI? Я так и играю... Это глупо. И глупо более всего поведение классов, написанных Borland. В общем, я знаю, как решить эту проблему, но тупыми способами, и знаю, как обойти эту проблему бочком, но это уход от проблемы. Может, кто-нибудь еще что-то может посоветовать?
С уважением.
Piter (2005-01-22 21:33:00) [6]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 ты это исключение, конечно, видишь.
Knight (2005-01-22 20:15:00) [7]
> [10] Polkan (22.01.05 19:52)
> Дохожу до строчки с readbool'ом.
> Нажимаю F8 и все! Вот он родимый ERegistryException.
Жми не F8, а F7...
Leonid Troyanovsky (2005-01-22 20:13:00) [8]
> Polkan (22.01.05 19:52) [10]
> Дохожу до строчки с readbool'ом.
> Нажимаю F8 и все! Вот он родимый ERegistryException.
В твоем обработчике вызывается WriteInteger(Integer?),
что чревато новым исключением при ненадлежащем Access.
--
Regards, LVT.
Knight (2005-01-22 20:01:00) [9]Что-то мне говорит, что ERegistryException возникает именно в ней и к вышеописанной процедуре отношения не имеет...
Knight (2005-01-22 19:59:00) [10]Дай в студию ReadBool...
novice__man (2005-01-22 19:53:00) [11]Было у меня такое. Если нет ветки в реестре, то при попытке открыть или проверить (OpenKey, OpenKeyReadOnly, KeyExists) вылетало исключение, которое не попадало в секцию except end;
Лекарство не найдено :(.
Ветка обсуждения: http://www.delphikingdom.com/asp/answer.asp?IDAnswer=27577
Delphi6 WindowsXP.
Knight (2005-01-22 19:52:00) [12]Я не понял... это урезанная процедура или ты обращаешься к своей функции ReadBool в которой и производишь чтение?
Polkan (2005-01-22 19:52:00) [13]Объясняю...
Дохожу до строчки с readbool'ом.
Нажимаю F8 и все! Вот он родимый ERegistryException.
Далее Ок и F8. Компилятор посчитал, что дальше процедуру не стоит продолжать и вышел из процедуры вообще.
Piter (2005-01-22 19:41:00) [14]поставть брекпоинт на строчке:
Checked := ReadBool('DeleteBadsOnExit');
И когда дойдет до этой строчки трассируй по F8.
И прямо здесь говори так: "Нажал F8, ничего не произошло, курсор перешел на такую то строчку. Нажал еще раз F8 - произошло то-то, курсор перешел на такую-то строчку, нажал опять F8..." и т.д.
Polkan (2005-01-22 19:36:00) [15]Оказалось, что ничего не решилось. Ступил я.
Вопрос в силе. (
Polkan (2005-01-22 19:30:00) [16]>begin...end
Вопрос решился.
Спасибо большое за флажок )
Но мне непонятно все-таки, почему до этого момента при включенном флажке у меня дебаггер все-таки входил в блок except.
begin...end (2005-01-22 19:08:00) [17]> [5] Polkan (22.01.05 19:07)
Для начала уберите флажок Tools -> Debugger Options -> Language Exceptions -> Stop on Delphi Exceptions.
Polkan (2005-01-22 19:07:00) [18]Я этим и занимаюсь в настоящее время.
Piter (2005-01-22 19:04:00) [19]ты дебагером отлаживал?
Polkan (2005-01-22 19:03:00) [20]В том-то и дело, что в дебаге при выполнении строчки ReadBool('DeleteBadsOnExit') вылетает исключение (и так и должно быть) ERegistryException "Failed to get data for моя переменная".
Исключение генерируется закономерно, поскольку такого ключа в реестре на самом деле нет, но дело не в этом - мне интересно, почему конструкция try ... except не работает, почему после той злосчастной операции программа просто вылетает из процедуры?