Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

ShowModal внутри try...except   Найти похожие ветки 

 
IGray   (2012-06-13 14:40) [0]

Здравствуйте! Есть простой код:

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   Form2.Showmodal;
 except
   on E: Exception do
      ShowMessage(E.Message);
 end;
end;

На второй форме куча кнопок, при нажатии на каждую из которых может сгенериться необрабатываемое исключение.
Сейчас при этом вызывается дефолтный обработчик, форма остаётся открытой и except..end никогда не выполняется, а мне бы хотелось чтобы форма автоматически закрылась и возникшее исключение попало во внешний блок except..end
Это возможно как-нибудь организовать?
Заранее спасибо!
Сорри, если туплю..


 
icWasya ©   (2012-06-13 16:16) [1]

Прямо так не получится. Каждое событие типа OnButtonEvent вызывается изнутри блока Try - Except и по выходе из блока event уничтожается.
Частично можно съымитировать таким образом.
1)добавить в форму TForm2 компонент ЕApplicationEvents и прописать у него событие OnException, а также добавить

private
 FMessage:String;
public
 procedure Execute;

...
implementation

procedure TForm2.ApplicationEvents1Exception(Sender: TObject;
 E: Exception);
begin
 FMessage:=E.Message;
 ModalResult:=100;
end;

procedure TForm2.Execute;
begin
 if ShowModal = 100 then
   raise Exception.Create(FMessage);
end;


А в форме Form1 чуть изменить обработчик нажатия на кнопку

procedure TForm1.Button1Click(Sender: TObject);
begin
try
  Form2.Execute;//<<======
except
  on E: Exception do
     ShowMessage(E.Message);
end;
end;


Правда при этом теряется информация о типе исключения и месте кго возникновения.
В новых версиях Дельфи, кажется начиная с D2010, в блоке Except можно создавать исключения, не теряющие информацию о месте возникновения предыдущего, но это изучи сам.


 
KSergey ©   (2012-06-13 17:35) [2]

Тип возникшего исключения можно запомнить в переменной типа ExceptClass.


 
Palladin ©   (2012-06-13 17:43) [3]

procedure TForm1.Button1Click(Sender: TObject);
begin
 try
   Form2.Showmodal;
 except
   Form2.Close
   raise;
 end;
end;


 
Loginov Dmitry ©   (2012-06-14 22:47) [4]


> Сейчас при этом вызывается дефолтный обработчик, форма остаётся
> открытой и except..end никогда не выполняется, а мне бы
> хотелось чтобы
форма автоматически закрылась и возникшее
> исключение попало во внешний блок except..end
> Это возможно как-нибудь организовать?
> Заранее спасибо!
> Сорри, если туплю..


 
Loginov Dmitry ©   (2012-06-14 22:47) [5]

Откуда такое желание возникло?


 
IGray   (2012-06-15 21:50) [6]

icWasya, KSergey, Palladin - большое Вам спасибо!
Раньше не мог ответить, сорри..

Интересно, если таких форм как Form2 много можно ли как-то оптимизировать код, чтобы не нужно было на каждую кидать TApplicationEvents и описывать метод Execute?
Сейчас думаю над этим..

> Откуда такое желание возникло?
Оно возникло из желания воспринимать вызов Showmodal так же, как и вызов любой другой процедуры или метода - иметь возможность заключить его в try..except и выполнить внутри except..end некие действия в случае необработанного исключения. Вполне возможно, что я хочу чего-то "не того" в следствии недопонимания идеологии Борланда по обработке таких исключений - тогда очень прошу наставить меня "на путь истинный" ;)
Я просто действительно хочу понять насколько нестандартным является моё желание и, соответственно, предложенное решение.

P.S. Palladin, проблема в том, что блок except..end не выполнится _никогда_.


 
robt   (2012-06-15 21:50) [7]


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

фтопку такую форму,программу и програмиста


 
IGray   (2012-06-15 22:26) [8]

фтопку такую форму,программу и програмиста
фтопку балаболов ;)

Вы наверное такой крутой мастер, что дефолтный обработчик вообще не перекрываете, потому что прям все все все возможные исключения заранее предвидите и обрабатываете прям в той точке где они происходят ;)
Может тогда поделитесь опытом с неучами, а то мой начальник ща ваш пост прочитает и уволит меня заодно с напарником)))


 
Loginov Dmitry ©   (2012-06-15 23:30) [9]


> Я просто действительно хочу понять насколько нестандартным
> является моё желание и, соответственно, предложенное решение.
>


Совершенно нестандартное желание. ShowModal отображает окно на экране в модальном режиме. С какой стати ошибки в обработчиках кнопок должны приводить к завершению ShowModal? Для этого, как правило, предусматривают кнопки "ОК" и "Отмена".


 
IGray   (2012-06-16 00:12) [10]

> Для этого, как правило, предусматривают кнопки "ОК" и "Отмена".
Ну, это если всё идёт хорошо - исключений нет, или есть только поправимые.. А что делать, если вылетело какое-нибудь непредусмотренное Access Violation? Глушить его дефолтным обработчиком каждой формы с выдачей сообщения пользователю и пусть потом пользователь сам закрывает форму? А разве не логично закрыть самостоятельно, не напрягая пользователя, раз уж форма всё равно непредсказуемо повреждена? А вдруг и кнопка "Закрыть" теперь откажет? А если ошибка произошла в OnActivate или OnShow?
Но ещё важнее другое.. Если я вызываю из одной процедуры другую, и по завершении выполнения вызванной хочу знать, были ли проблемы - это ведь нормально? А почему вызывая ShowModal я не имею право на это?
Спасибо за ответ!


 
Германн ©   (2012-06-16 00:52) [11]


> Глушить его дефолтным обработчиком каждой формы с выдачей
> сообщения пользователю и пусть потом пользователь сам закрывает
> форму?

А зачем обязательно нужно закрывать эту модальную форму при возникновении исключения? Что это вообще за форма и что она делает?


 
IGray   (2012-06-16 03:07) [12]

> А зачем обязательно нужно закрывать эту модальную форму
> при возникновении исключения?

Если произошло необработанное (т.е. непредвиденное)
исключение, то невозможно точно даже предсказать, что пользователь увидит на форме, какие кнопки будут активны, корректны ли графики, диаграммы и т.д. и т.п. Какой смысл держать такую (поломанную) форму открытой и заставлять пользователя с ней общаться? Может она настолько поломана, что он её даже закрыть не сможет.. Но суть даже не в закрытии, а в том, что я хочу снаружи узнать, что внутри ShowModal произошла авария. Это странно?

> Что это вообще за форма и что она делает?

А какая разница? Я же не про конкретную форму спрашиваю, а про борландовскую идеологию обработки исключений в ShowModal..
Но могу сказать, что форма активно взаимодействует с пользователем, на котором куча датчиков, пишет данные в файлы и буфера, одновременно строит графики.. Короче - это не банальное диалоговое окно с запросом ФИО и все ситуации не предскажешь.


 
IGray   (2012-06-16 03:11) [13]

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


 
Anatoly Podgoretsky ©   (2012-06-16 08:32) [14]


> а в том, что я хочу снаружи узнать, что внутри ShowModal
> произошла авария. Это странно?

Хочешь узнать снаружи не держи в себе


 
Плохиш ©   (2012-06-16 10:17) [15]


> IGray   (16.06.12 03:07) [12]

Судя по этому посту, вам пора нанимать программиста. Ибо вы с напарником относитесь к программированию как к волшебству, не понимая, что же за чудеса происходят в вашей же программе.


 
sniknik ©   (2012-06-16 11:39) [16]

> Просто данная проблема мне кажется типовОй, а значит у неё и решение должно быть типовое..
да, Access Violation это типовая ошибка кривого "программинга". типовое решение - найти глюки в коде и исправить их.
случается настолько редко (у нормальных программистов), что не нуждается в каких то дополнительных стандартных действиях устраняющих последствия. кроме выпуска исправленной версии программы, без бага.


 
IGray   (2012-06-16 11:59) [17]

> Плохиш ©   (16.06.12 10:17) [15]
> вы с напарником относитесь к программированию как к волшебству

Как же любят некоторые заниматься психоанализом собеседников на любых форумах, кроме, конечно, психологических - там слАбо?
Вообще, походу именно Вы относитесь к программированию как к волшебной палочке, которой нельзя ни с кем поделиться, но обязательно надо на каждом углу намекать, что она у Вас есть, а то вдруг никто не узнает, что Вы такой гениальный программист ;) Как тогда жить?
Я задал совершенно конкретный вопрос и не нужно, пожалуйста, тут метить территорию, если Вам нечего ответить "по существу". Может это Вам нужно нанять программиста, который отвечал бы на форумах вместо Вас? Или самому похамить охота? Я допускаю, что Вы разбираетесь в обработке исключений, но, очевидно, не настолько хорошо, чтобы попытаться ясно и чётко сформулировать ответ по теме. "Кто ясно мыслит - ясно излагает".
А ещё вероятнее, что ответа на данный вопрос у Вас просто нет, и Вас раздражает само существование таких вопросов, так как они мешают Вам себя идеализировать. Хотели психоанализа - получИте ;))

> Anatoly Podgoretsky ©   (16.06.12 08:32) [14]
> Хочешь узнать снаружи не держи в себе

Спасибо! Вы предлагаете передавать исключение "наверх" как в советах [1][2]?
А к вопросу об идеологии можете что-нибудь добавить?
Очень интересно Ваше мнение!


 
IGray   (2012-06-16 12:07) [18]

> да, Access Violation это типовая ошибка кривого "программинга".
>  типовое решение - найти глюки в коде и исправить их.

Спасибо за ответ! Разумеется Вы правы, но ведь ведь чтобы исправить ошибку её сначала нужно увидеть, так? А если ошибка происходит при одном запуске из ста, то нельзя исключить, что её первым увидит пользователь. А значит её нужно грамотно обработать, отсюта и вопрос - как это сделать лучше..
Кроме того ведь неизвестно, какие баги могут вылезти из чужих компонентов и либ..


 
sniknik ©   (2012-06-16 12:44) [19]

> но ведь ведь чтобы исправить ошибку её сначала нужно увидеть, так?
не только, еще и нужно "место засечь", где произошла. при твоей же "схеме" юзер открывает окно, в нем другое, там еще какое то из ста возможных (утрированно), выполняет какое то действие с глючным участком кода... и пошла "обратная матрешка" вываливаемся из окна с ошибкой, после из его родителя (в нем же тоже глюк, внутренняя форма вылетела...) и т.д. откатываемся до главной и "формы вам все одно не нужны, была ошибка, скажите программисту где" ??? ответ клиента предсказуем как 2x2.
и логов с записью по действиям у тебя тоже нет... судя по возмущенному ->
> Глушить его дефолтным обработчиком каждой формы с выдачей сообщения пользователю и пусть потом пользователь сам закрывает форму?
а это как раз нормальная практика... только не "глушить", а обработать, записать в лог с пояснением что/где делалось, и если необходимо кинуть эксепт дальше.


 
sniknik ©   (2012-06-16 12:46) [20]

> какие баги могут вылезти из чужих компонентов и либ..
использование кривых чужих компонентов это тоже твой баг, не уверен, пиши его сам.


 
robt   (2012-06-16 12:59) [21]


> IGray   (15.06.12 22:26) [8]

я не пользуюсь try\except вообще так же как и VCLом, если возникают ошибки-исправляю


 
IGray   (2012-06-16 14:45) [22]

О, это уже похоже на обсуждение, спс.
> > но ведь ведь чтобы исправить ошибку её сначала нужно увидеть,  так?
> не только,

Я имел в виду - как минимум.

> и логов с записью по действиям у тебя тоже нет
Хехе..) Даже не представляете, насколько Вы тут ошибаетесь - у нас программа отсылает ТОННУ всевозможной диагностической информации для воспроизведения и локализации ошибки. Я в жизни не встречал ни одной программы, которая хоть половину из этого  отсылала. Кстати, для меня загадка, почему даже в крутых продуктах этого нельзя встретить..
Дело в другом - до последнего времени наша прога в случае необрабатываемого исключения благополучно крэшилась с выводом культурного сообщения и отправкой диагностической информации, и завершалась без всяких попыток самовосстановления.
И это было правильно и нормально, и обычно никому ничего другого и не надо. Но теперь есть пожелание клиента, чтобы программа при выполнении некоторых действий не крэшилась, а перезагружала плагин и попыталась бежать дальше, так как высока вероятность, что ошибка не повторится.
Вероятно мало кому такое надо, потому и мало дельных ответов на мой вопрос..

> использование кривых чужих компонентов это тоже твой баг,  не уверен, пиши его сам.
Если в программе или компоненте ошибка у пользователя проскакивает раз в месяц, а на моём компе вообще не воспроизводится - он кривой? Очевидно, Вы очень круты, если в Вашем коде такое невозможно..
Кроме того, как насчёт глюков самой винды полностью "разломанной" пользователем? Вы можете предсказать все их последствия?

> обработать, записать в лог с пояснением что/где делалось,
>  и если необходимо кинуть эксепт дальше.

Дык я об этом и спрашиваю - как именно правильнее кинуть эксепт дальше если он произошёл при выполнении ShowModal?? Как в [1]?


 
Loginov Dmitry ©   (2012-06-16 15:03) [23]


> у нас программа отсылает ТОННУ всевозможной диагностической
> информации для воспроизведения и локализации ошибки.


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


> Кстати, для меня загадка, почему даже в крутых продуктах
> этого нельзя встретить..


Крутые продукты разрабатывают нормальные программисты, которые решают поставленные задачи, а не тратят время на ерунду.


 
sniknik ©   (2012-06-16 15:03) [24]

> Очевидно, Вы очень круты, если в Вашем коде такое невозможно..
ты даже не представляешь насколько... и тем не менее, я просто нормальный программист.
кроме того не передергивай, не невозможно, а редко. я так сказал. и чаще всего ловится на этапе разработки/отладки.

> Дык я об этом и спрашиваю - как именно правильнее кинуть эксепт дальше
нет, ты спрашиваешь как прервать нормальную работу "замкнутой системы", и кинуть эксепт наружу. разница однако. к тому же ты хочешь сделать это не изнутри, а снаружи... + по надуманной причине. фактически не желая исправлять свои ошибки, вместо этого "узаконить" их.


 
Anatoly Podgoretsky ©   (2012-06-16 15:26) [25]

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


 
Anatoly Podgoretsky ©   (2012-06-16 15:29) [26]

Ну разве что - убери внутри try except end или перепиши так что бы вылазило наружу.
А то что то много любителей такого кода.



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

Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.069 c
15-1346298363
brother
2012-08-30 07:46
2013.03.22
Помогите с алгоритмом


8-1230540711
inviz
2008-12-29 11:51
2013.03.22
Длинна avi файла (некоректно определяет)


2-1342438715
Pcrepair
2012-07-16 15:38
2013.03.22
Как правильно запустить один цикл внутри другого?


15-1349295678
ProgRAMmer Dimonych
2012-10-04 00:21
2013.03.22
Подсчёт ссылок на строку таблицы в MySQL


15-1342015306
Дмитрий С
2012-07-11 18:01
2013.03.22
Apache mod_rewrite





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский