Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
15-1146811531
Firefly
2006-05-05 10:45
2006.05.28
Interbase 7.5


2-1147344647
apl
2006-05-11 14:50
2006.05.28
Про файлы


2-1147417490
wirg
2006-05-12 11:04
2006.05.28
Фильтр


15-1146726042
mfender
2006-05-04 11:00
2006.05.28
Форматирование кода в IDE


5-1132337922
CHES
2005-11-18 21:18
2006.05.28
Нестандартный элемент управления





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