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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.162 c
15-1339778375
TUser
2012-06-15 20:39
2013.03.22
Лапша


2-1333617342
gadget
2012-04-05 13:15
2013.03.22
Сервер WordApplication


15-1343987497
AV
2012-08-03 13:51
2013.03.22
Quip 2012. Как раз и навсегда изменить порт с 433 на 5190?


10-1183115528
vir
2007-06-29 15:12
2013.03.22
TWebBrowser и TThread


2-1333499708
Dron55555555555
2012-04-04 04:35
2013.03.22
Дробные числа 2