Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


AlexanderMS ©   (2008-07-27 18:30:00) 

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

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


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


> AlexanderMS


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


AlexanderMS   (2008-07-30 12:37:00) [2]


> Alucard   (27.07.08 21:09) [5]

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


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

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


Leonid Troyanovsky   (2008-07-30 11:50:00) [3]


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

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

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

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

--
Regards, LVT.


AlexanderMS   (2008-07-30 11:17:00) [4]

Сделал так:

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).


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


> Alucard   (27.07.08 21:09) [5]

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


AlexanderMS   (2008-07-28 12:02:00) [6]

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


Anatoly Podgoretsky   (2008-07-28 11:50:00) [7]

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

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


TUserClass   (2008-07-28 11:41:00) [8]

А как ж Application.OnException?


Ega23   (2008-07-28 11:40:00) [9]

Application.OnException


123-ий   (2008-07-28 11:38:00) [10]


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

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


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


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


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


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

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


AlexanderMS   (2008-07-27 19:23:00) [13]


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

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


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

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

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


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


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


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


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


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


AlexanderMS   (2008-07-27 18:49:00) [15]


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


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


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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо