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

Вниз

Как сделатиь перехватчик фатальных ошибок в программе   Найти похожие ветки 

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

Наверх




Память: 0.56 MB
Время: 0.038 c
15-1146648940
Styx_
2006-05-03 13:35
2006.05.28
Drag n Drop из The Bat!


15-1146089696
Германн
2006-04-27 02:14
2006.05.28
Ресурсы GDI


15-1146643908
tigra
2006-05-03 12:11
2006.05.28
Имена в архиве


1-1145425737
K_VAL
2006-04-19 09:48
2006.05.28
Восстановить иконку проекта


4-1141637653
kay
2006-03-06 12:34
2006.05.28
Как mdichild форму сделать toolwindow?