Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Внизпроблема с 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c