Форум: "Прочее";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
ВнизКак сделатиь перехватчик фатальных ошибок в программе Найти похожие ветки
← →
DelphiN! © (2006-05-02 14:38) [0]Хочу сделать, чтобы при возникновении фатальных ошибок в программе сообщения о них не возникали, а программа сразу же закрывалась, без каких либо сообщений, пробовал так:
procedure TLoading_Form.OnCreate(Sender: TObject);
begin
Application.OnException := AppException;
end;
procedure TLoading_Form.AppException(Sender: TObject; E: Exception);
begin
Application.Terminate;
end;
Однако при возникновении фатальной ошибки сначало выдается сообщение о ней, а после нажатия кнопки "Ok" программа закрывается
← →
Юрий Зотов © (2006-05-02 15:11) [1]
program Project1;
uses
Forms,
Unit1 in "Unit1.pas" {Form1};
{$R *.res}
begin
try
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
except
end
end.
← →
Rouse_ © (2006-05-02 15:12) [2]
> Юрий Зотов © (02.05.06 15:11) [1]
Жестко :)
← →
Ega23 © (2006-05-02 16:12) [3]
> Юрий Зотов © (02.05.06 15:11) [1]
Сначала даже не въехал...
Чё-то в натуре жёстко. Я бы даже сказал - жестоко! :о)
← →
Юрий Зотов © (2006-05-02 16:18) [4]Вот такие жестокие шутки у меня, что делать.
Впрочем, каков вопрос...
:о)
← →
DelphiN! © (2006-05-02 17:18) [5]Не перехватывает данный способ фатальные ошибки. Как я понимаю программа не оповещается об ошибках такого рода, а отлавливает их сам виндовс, после чего выводит сообщение с кнопками Отправлять или не отправлять отчет, программа же остается висеть в памяти пока эти самые кнопки не нажать. Так вот мне нужно чтобы при возникновении ошибок программа тупо закрывалась, без каких либо сообщений. А это в свою очередь необходимо для того, чтобы мьютекст программы хранящийся в памяти удалялся, и можно было запустить другую копию программы
← →
VirEx © (2006-05-02 17:21) [6]что это у тебя за ошибки такие ужасные что не перехватываются?)
попробуй поставить в начале своего кода:
SetErrorMode(SEM_FAILCRITICALERRORS);
← →
DelphiN! © (2006-05-02 17:32) [7]
> [6] VirEx © (02.05.06 17:21)
Не помагает, при возникновении ошибки сначало выдается сообщение о том что "Инструкция такая то обратилось по памяти такойто и не может быть read", Нажмите Ок для завершения и Отмену для отладки" При этом программа нормально работает до того как нажать Ок или Отмену, после нажатия программа закрывается и выдается еще одно сообщение с текстом "Неизвесное исключение ... в приложении по адресу ... " Потом опять первое сообщенеие об ошибке, потом Runtime error 216 at адрес такой-то. При этом mutext остается в памяти пока не нажать ОК на всех сообщениях
← →
Джо © (2006-05-02 17:34) [8]А найти и исправить ошибку в голову не приходило? :)
← →
Desdechado © (2006-05-02 17:35) [9]может, лучше исправлять ошибки?
← →
tesseract © (2006-05-02 17:37) [10]ограничивай опасные блоки.
try .. except
хоть разберёшься где что.
← →
VirEx © (2006-05-02 17:40) [11]
> mutext остается в памяти пока не нажать ОК на всех сообщениях
он останется пока программа "жива")
← →
DelphiN! © (2006-05-02 17:47) [12]
> [8] Джо © (02.05.06 17:34)
> [9] Desdechado © (02.05.06 17:35)
Просто нельзя допустить такого поведения. Убирать ошибки то это естественно нужно, только вот может обнаружится еще одна ошибка, которую я не обнаружил и не обработал, а вот этого допустить нельзя, так что вот приходится подстраховываться ...
> [11] VirEx © (02.05.06 17:40)
mutext остается в памяти до тех пор, пока не закрыть сообщения обовсех ошибках, а программа перестает функционировать сразу. Так вот мне и нужно запускать другую копию программы сразу после краха первой, а о крахе первой я могу узнать только после того как mutext будет выгружен из памяти
← →
Мефисто (2006-05-02 17:51) [13]DelphiN! © (02.05.06 17:47) [12]
А то что программа закрывается без ведомых на то причин пользователь воспримет, как должное, а не ошибку??? :)
← →
Джо © (2006-05-02 17:52) [14]Что-то как-то запутано всё... Возможно, по сути своей, программа является сервисом (не требует взаимодействия с пользователем, работает все время, пока загружена ОС и т.п.)? Не сделать ли ее таковой явно? Это, конечно, не снимает необходимости избавиться от ошибок. Но окна о "недопустимой операции" не будет.
← →
VirEx © (2006-05-02 17:52) [15]
> [12] DelphiN! © (02.05.06 17:47)
значит в исключении делай releasemutex()
но насчет жизни мьютекса - повторятся не буду :)
← →
Jeer © (2006-05-02 17:53) [16]DelphiN! © (02.05.06 14:38)
..
DelphiN! © (02.05.06 17:47) [12]
Или бред или песочница.
См.
Desdechado © (02.05.06 17:35) [9]
Джо © (02.05.06 17:34) [8]
"Или вагоны грузить" (С)
Там ошибка тебе дороже обойдется, может и запомнишь, если будет чем.
← →
Плохиш © (2006-05-02 17:59) [17]
> DelphiN! © (02.05.06 17:32) [7]
> Не помагает, при возникновении ошибки сначало выдается сообщение
> о том что "Инструкция такая то обратилось по памяти такойто
> и не может быть read", Нажмите Ок для завершения и Отмену
> для отладки" При этом программа нормально работает до того
> как нажать Ок или Отмену, после нажатия программа закрывается
> и выдается еще одно сообщение с текстом "Неизвесное исключение
> ... в приложении по адресу ... "
В результате ошибки в программе или неправильной настройки системы/окружения/аппаратные несоответствия(разгон)/глюкавые драйвера/... , она (программа) пытается не просто залесть в нераспределённую память, а в память, котороя вообще не принадлежит программе, т.к. система такой наглости не позволяет, то виновный процесс уничтожается, о чём тебе и сообщается. Ни какими try...except это уже не отловишь. Готовь много пива-закуси и начинай отладку.
← →
Torry © (2006-05-02 18:00) [18]EurekaLog?
← →
Джо © (2006-05-02 18:03) [19]Подкину "до кучи" FastMM — модуль, содержащий альтернативный менеджер памяти, с проверкой и индикацией всех утечек оной. Может, пригодится, для отладки. Еще есть MemCheck, аналогичный. Хорошие штуки, мне неоднократно помогали при отладке чужих исходников, и своих :)
← →
Jeer © (2006-05-02 18:05) [20]Плохиш © (02.05.06 17:59) [17]
Недавно была обнаружена "какая-то" установка видимо левой XP, где дохла даже "пустая" форма от Delphi 7.
Вылечилось кардинально переустановкой XP.
← →
Плохиш © (2006-05-02 18:10) [21]
> Jeer © (02.05.06 18:05) [20]
Ну, дык, поэтому я "..." и поставил :-)
Просто это сообщение говорит о том, что причина лежит за областью действия программы и слишком опасны, что бы система позволила программе дальше работать, поэтому ни какие try...except не помогут.
← →
DelphiN! © (2006-05-02 18:12) [22]
> [16] Jeer © (02.05.06 17:53)
> [14] Джо © (02.05.06 17:52)
> [13] Мефисто (02.05.06 17:51)
Пытаюсь я исправлять все ошибки, и незнаю сейчас существующей, но а вдруг найдут пользователи ее, и будут программу закрывать, а мне о ней не скажут, и не смогу я ее исправить, так как знать не буду. А мне они не скажут, уж поверьте, так как в их интересах программу закрыть. А мне в свою очередь нужно предохранится и от этой ситуации.
> [15] VirEx © (02.05.06 17:52)
не передается управление обработчику при возникновении такого рода ошибок. Как я понял винда первая их отлавливает и приостанавливает процесс, допустивший такое, поэтому releasemutex я и не могу сделать
← →
Jeer © (2006-05-02 18:15) [23]DelphiN! © (02.05.06 18:12) [22]
Для этого существует идея логов ошибок.
Наиболее правильная.
Раз в *надцатое число положено логи отправлять разработчику иначе функциональность программы не гарантируется.
← →
DelphiN! © (2006-05-02 18:16) [24]
> [23] Jeer © (02.05.06 18:15)
Нук пока посмотрю я этот лог, пока исправлю, а недопустить закрытия программы нельзя не на минуту. А логи то эт понятно.
← →
Плохиш © (2006-05-02 18:17) [25]
> А мне они не скажут, уж поверьте, так как в их интересах
> программу закрыть.
О создатель троянов-шпионов. Закроют и правильно сделают, ибо не фик.
← →
REA (2006-05-02 18:22) [26]>выводит сообщение с кнопками Отправлять или не отправлять отчет
Боишься письмами завалят?
← →
Jeer © (2006-05-02 18:26) [27]DelphiN! © (02.05.06 18:16) [24]
> недопустить закрытия программы нельзя не на минуту.
Как ? Опять для атомных станций софт пишут "мальчики" ?
← →
DelphiN! © (2006-05-03 09:37) [28]
> [25] Плохиш © (02.05.06 18:17)
Это не троян, это Шелл с ограничеными возможностями для интернет кафе всяких, а он закрываться не должен, так как за время платить должны.
> [27] Jeer © (02.05.06 18:26)
Хватит уже!
Да и вообще причем тут что я пишу и для кого? Вопрос ведь был Как сделать чтобы при возникновении фатальной ошибки программа закрывалась без всяких уведомлений виндовых. Вот на него я бы и хотел ответ получить, а если кто незнает и никаких мыслей в голову не приходит лучше не пишите, флуд один получается!
← →
Jeer © (2006-05-03 09:45) [29]DelphiN! © (03.05.06 09:37) [28]
> Как сделать чтобы при возникновении фатальной ошибки программа
> закрывалась без всяких уведомлений
перейди на DOS.
← →
balepa © (2006-05-03 09:46) [30]
> DelphiN! © (03.05.06 09:37) [28]
Тебе уже посоветовали исправлять Ашипки.
← →
DelphiN! © (2006-05-03 09:54) [31]
> [30] balepa © (03.05.06 09:46)
А я уже написал, что исправляю ошибки, и что незнаю существующей, но если ошибку всетаки найдут, до того как я о ней узнаю и исправлю пройдет время и вот я хочу чтобы вот это вот время которое будет потрачено на исправление ошибки программа вела бы себя так как я хочу
← →
boriskb © (2006-05-03 09:54) [32]DelphiN! © (03.05.06 9:37) [28]
Хватит уже!
Да не обижайся ты.
Правильно тебе говорят об ошибке в методологии.
Нельзя так писать - так только геморой себе наживешь.
Что бы делал я на твоем месте.
1) Очень жесткий тестинг, проводимый тобой
2) Опытная эксплуатация. Обязательный и очень важный период. Когда программа уже вроде и сдана, но ты всегда на связи и моментально реагируешь.
3) Как говорят классики: "программ без ошибок не бывает". Всегда может найтись комбинация входных данных, ситуация, пользователь, которые порушат прогу.
Для этого пишутся инструкции по эксплуатации.
А твоя идея принципиально не верна.
← →
Kerk © (2006-05-03 13:48) [33]Можно попробовать с цепочкой SEH извратиться.. переопределить самый верхний обработчик.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2006.05.28;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.01 c