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

    Если можно это сделать, то подскажите, пожалуйста, как.
  • Сергей М. © (27.07.08 18:38) [1]

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


    Нельзя.
    Нет и не может быть такой процедуры.
  • AlexanderMS © (27.07.08 18:49) [2]

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


    Тогда при каком условии вызывается окошко "Runtime Error"? Не просто же так... или в обычном VCL-приложении - "Access Violation"?
  • Сергей М. © (27.07.08 18:57) [3]

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


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


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


    Не надо месить в одну кучу ошибки и исключения - и тех и других тьма тьмущая самых разных, по самому разному поводу.
  • AlexanderMS © (27.07.08 19:23) [4]

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

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


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

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

    А исключения в Delphi на все ошибки предусмотрены или нет?
  • Alucard (27.07.08 21:09) [5]
    Такие ошибки можно перехватить с помощью функции SetUnhandledExceptionFilter (http://msdn.microsoft.com/en-us/library/ms680634(VS.85).aspx). Ей передается callback, в котором можно определить поведение программы при наступлении необработанной ошибки.
  • Сергей М. © (28.07.08 08:13) [6]

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


    Если ты в ходе работы своего приложения изгадил до неузнаваемости, к примеру, RTL, то тебе никакие перехваты уже не помогут.
  • 123-ий © (28.07.08 11:38) [7]

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


    Ну или вроде того :)
  • Ega23 © (28.07.08 11:40) [8]
    Application.OnException
  • TUserClass © (28.07.08 11:41) [9]
    А как ж
    Application.OnException

    ?
  • Anatoly Podgoretsky © (28.07.08 11:50) [10]
    > 123-ий  (28.07.2008 11:38:07)  [7]

    А спрашивать зачем, ведь он уже установил, пусть сразу и форматирует, что бы не зря.
  • AlexanderMS © (28.07.08 12:02) [11]
    Удалено модератором
    Примечание: Обсуждение модерирования
  • AlexanderMS © (28.07.08 12:05) [12]

    > Alucard   (27.07.08 21:09) [5]

    Спасибо, я попробую.
  • AlexanderMS © (30.07.08 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).
 
Конференция "Начинающим" » Процедура, вызываемая при ошибке в программе.
Есть новые Нет новых   [134435   +35][b:0][p:0.001]