Форум: "Начинающим";
Текущий архив: 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