Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.51 MB
Время: 0.042 c
1-1106434307
Pine
2005-01-23 01:51
2005.02.06
Создание файла эксель и запись в него при помощи OLE


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


1-1106729414
Angela
2005-01-26 11:50
2005.02.06
Чтобы Panel1 и Panel2 не пересекались!


14-1105886309
Fenik
2005-01-16 17:38
2005.02.06
Откуда на Титане метан?


1-1106318220
Eraser
2005-01-21 17:37
2005.02.06
TJvRichEdit и распознавание смайликов.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский