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

Вниз

Процедура, вызываемая при ошибке в программе.   Найти похожие ветки 

 
AlexanderMS ©   (2008-07-27 18:30) [0]

Скажите, пожалуйста, можно ли установить процедуру, которая будет вызываться при любой ошибке, происходящей в моей программе (при которой отображается окошко Runtime Error)? Просто хочется сделать запасной вариант вроде отображения сообщения: "Непридвиденная ошибка. Попробуйте переустановить игру" и сделать экстренный выход с освобождением памяти...
Просто вдруг какой-нибудь файл останется из старой версии игры, и игра по таймеру каждый кадр будет отображать окошко "Runtime Error" и тормозить систему (уже было так) :)

Если можно это сделать, то подскажите, пожалуйста, как.


 
Сергей М. ©   (2008-07-27 18:38) [1]


> процедуру, которая будет вызываться при любой ошибке, происходящей
> в моей программе


Нельзя.
Нет и не может быть такой процедуры.


 
AlexanderMS ©   (2008-07-27 18:49) [2]


> Нельзя.
> Нет и не может быть такой процедуры.


Тогда при каком условии вызывается окошко "Runtime Error"? Не просто же так... или в обычном VCL-приложении - "Access Violation"?


 
Сергей М. ©   (2008-07-27 18:57) [3]


> при каком условии вызывается окошко "Runtime Error"?


При необработанной ран-тайм ошибке.
Код которой, кстати, тайна за семью печатями - ты же его прячешь)


> или в обычном VCL-приложении - "Access Violation"?


Не надо месить в одну кучу ошибки и исключения - и тех и других тьма тьмущая самых разных, по самому разному поводу.


 
AlexanderMS ©   (2008-07-27 19:23) [4]


> > при каком условии вызывается окошко "Runtime Error"?
> При необработанной ран-тайм ошибке.

Так мне это и нужно. Каким образом появляется окошко?


> Код которой, кстати, тайна за семью печатями - ты же его
> прячешь)

Не понял... Я же в общем случае говорю, код любой может быть.

А исключения в Delphi на все ошибки предусмотрены или нет?


 
Alucard   (2008-07-27 21:09) [5]

Такие ошибки можно перехватить с помощью функции SetUnhandledExceptionFilter (http://msdn.microsoft.com/en-us/library/ms680634(VS.85).aspx). Ей передается callback, в котором можно определить поведение программы при наступлении необработанной ошибки.


 
Сергей М. ©   (2008-07-28 08:13) [6]


> мне это и нужно


Если ты в ходе работы своего приложения изгадил до неузнаваемости, к примеру, RTL, то тебе никакие перехваты уже не помогут.


 
123-ий ©   (2008-07-28 11:38) [7]


try
 // Код, в котором скорее всего возникнет стопицот ошибок
except
 YourProcedure;
 ShowMessage("Зря Вы установили мою игру! В ней слишком много ошибок! Немедленно удалите её и отформатируйте жёсткий диск!");
end;

Ну или вроде того :)


 
Ega23 ©   (2008-07-28 11:40) [8]

Application.OnException


 
TUserClass ©   (2008-07-28 11:41) [9]

А как ж Application.OnException ?


 
Anatoly Podgoretsky ©   (2008-07-28 11:50) [10]

> 123-ий  (28.07.2008 11:38:07)  [7]

А спрашивать зачем, ведь он уже установил, пусть сразу и форматирует, что бы не зря.


 
AlexanderMS ©   (2008-07-28 12:02) [11]

Удалено модератором
Примечание: Обсуждение модерирования


 
AlexanderMS ©   (2008-07-28 12:05) [12]


> Alucard   (27.07.08 21:09) [5]

Спасибо, я попробую.


 
AlexanderMS ©   (2008-07-30 11:17) [13]

Сделал так:

SetUnhandledExceptionFilter(@ExceptionHandler);

function ExceptionHandler(Pointers : Pointer) : Integer; stdcall;
begin
 MessageBox(glHandle, "Serious error", "error", MB_ICONHAND);
 Result := 1;//EXCEPTION_EXECUTE_HANDLER;
end;


Функция не вызывается. Отображается стандартное окно "Runtime Error" (Проект без VCL).


 
Leonid Troyanovsky ©   (2008-07-30 11:50) [14]


> AlexanderMS ©   (30.07.08 11:17) [13]

> Функция не вызывается. Отображается стандартное окно "Runtime
> Error" (Проект без VCL).

Для того, чтобы она могла вызываться необходимо
заменить System.pas своей версией.

А, во-ще-то, RTFM: ExceptProc variable.

--
Regards, LVT.


 
AlexanderMS ©   (2008-07-30 12:37) [15]


> Alucard   (27.07.08 21:09) [5]

Спасибо большое! Всё работает! Просто я запускал из-под Delphi, а теперь запустил из Проводника, и функция работает. Только потом всё равно отображется окно с Runtime Error, но это не проблема.


> Для того, чтобы она могла вызываться необходимо
> заменить System.pas своей версией.
>
> А, во-ще-то, RTFM: ExceptProc variable.

Спасибо за информацию.


 
Сергей М. ©   (2008-07-30 12:55) [16]


> AlexanderMS


С причиной (источник ошибки) надо бороться, а не со следствием (извещение юзера об ошибке).



Страницы: 1 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1217408913
денис_м
2008-07-30 13:08
2008.09.07
Настройки в программе


3-1205422412
Цукор5
2008-03-13 18:33
2008.09.07
OLE и FireBird


15-1216526036
Riply
2008-07-20 07:53
2008.09.07
C++ дефайны и выравнивание.


3-1205316974
иван8511
2008-03-12 13:16
2008.09.07
Не уменьшается размер файла при удалении лишних записей


2-1217323851
ifrau
2008-07-29 13:30
2008.09.07
О правильном коде