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

Вниз

Общий обработчик ошибок, завершающий программу.   Найти похожие ветки 

 
И. Павел ©   (2010-06-28 09:53) [0]

Здравствуйте.

Я хочу, чтобы все необработанные ошибки в моей программе завершали ее работу.
Для этого я написал такой обработчик Application.OnException:
procedure TForm1.OnE(Sender: TObject; E: Exception);
begin
 try
 //обработка ошибки
 except
 end;
 halt;
end;

И присваиваю его перед run:
Application.OnException := Form1.OnE;
Application.Run;

Мне кажется, что обрабатывать большинство ошибок в одной функции удобно, т.к. в программе можно просто поменять класс возникшего исключения на нужный, а обработку всех ошибок этого класса делать в OnE.

Подскажите, пожалуйста, гарантирует ли эта запись, что абсолютно все ошибки в программе приведут к ее завершению, и это завершение произойдет сразу же после возникновения ошибки (т.е. не успеет обработаться какое-нибудь посланное ранее сообщение и т.д.)?

Попытался разобраться в коде метода TApplication.HandleException – но там вызов OnE произойдет только, если  “if ExceptObject is Exception then”, а иначе вызовется SysUtils.ShowException…Что это за ошибки такие: not (ExceptObject is Exception) и все ли они приводят к завершению программы?

Заранее спасибо.


 
12 ©   (2010-06-28 10:36) [1]

> Подскажите, пожалуйста, гарантирует ли эта запись, что абсолютно
> все ошибки в программе приведут к ее завершению, и это завершение
> произойдет сразу же после возникновения ошибки (т.е. не
> успеет обработаться какое-нибудь посланное ранее сообщение
> и т.д.)?

как показывает моя практика - нет


> Попытался разобраться в коде метода TApplication.HandleException
> – но там вызов OnE произойдет только, если  “if ExceptObject
> is Exception then”, а иначе вызовется SysUtils.ShowException…
> Что это за ошибки такие: not (ExceptObject is Exception)
> и все ли они приводят к завершению программы?

как показывает моя практика - нет


 
Leonid Troyanovsky ©   (2010-06-28 11:04) [2]


> И. Павел ©   (28.06.10 09:53)  

> Application.OnException := Form1.OnE;

Проще пользоваться TApplicationEvents.

> Мне кажется, что обрабатывать большинство ошибок в одной
> функции удобно, т.к. в программе можно просто поменять класс
> возникшего исключения на нужный, а обработку всех ошибок
> этого класса делать в OnE.

Непонятно, зачем менять класс и терять исходную информацию.

> Подскажите, пожалуйста, гарантирует ли эта запись, что абсолютно
> все ошибки в программе приведут к ее завершению,

Кроме производных EAbort и только в течении Run.

> не успеет обработаться какое-нибудь посланное ранее сообщение

Не успеет.

--
Regards, LVT.


 
И. Павел ©   (2010-06-28 11:48) [3]

> Кроме производных EAbort и только в течении Run.

Спасибо. Тогда буду отлавливать ошибки в нем (кроме рядовых, которые ожидаются (вроде некорректного пользовательского ввода)).


> Непонятно, зачем менять класс и терять исходную информацию.

В частности, я хочу к каждой ошибке от ADODataSet.Open и ADOCommand.Execute прибавить еще и указатель на ADO-объект (чтобы при ошибке можно было посмотреть запрос, который к ней привел). При этом класс старой ошибки я, наверное, тоже сохраню.


> как показывает моя практика - нет

Остается только надеяться, что этот "неуловимый Джо" возникает только в консольных программах и вне блока run (где он благополучно закроет приложение).


 
Leonid Troyanovsky ©   (2010-06-28 12:11) [4]


> И. Павел ©   (28.06.10 11:48) [3]

> В частности, я хочу к каждой ошибке от ADODataSet.Open и
> ADOCommand.Execute прибавить еще и указатель на ADO-объект
> (чтобы при ошибке можно было посмотреть запрос, который
> к ней привел).

В ApplicationEvents.OnException он и так есть: Sender: TObject.

> возникает только в консольных программах и вне блока run

Ну, можно еще ExceptProc.

--
Regards, LVT.


 
И. Павел ©   (2010-06-28 14:30) [5]

> Ну, можно еще ExceptProc.

Спасибо.
Но перед и после run, кажется, и так при ошибке программа закрывается, а внутри run все ошибки application перехватывает.
Но все же мне кажется странным обработка ошибок неизвестных классов просто путем вывода сообщения: SysUtils.ShowException(ExceptObject, ExceptAddr); И, похоже, никак эту штуку не перекрыть...


 
Leonid Troyanovsky ©   (2010-06-28 14:33) [6]


> И. Павел ©   (28.06.10 14:30) [5]

> Но все же мне кажется странным обработка ошибок неизвестных
> классов просто путем вывода сообщения: SysUtils.ShowException(ExceptObject,
>  ExceptAddr); И, похоже, никак эту штуку не перекрыть...

А зачем ее перекрывать? Достаточно просто не вызывать ее.

--
Regards, LVT.


 
И. Павел ©   (2010-06-28 14:57) [7]

> А зачем ее перекрывать? Достаточно просто не вызывать ее.

А сама система внутри run генерирует только потомки exception?


 
Leonid Troyanovsky ©   (2010-06-28 15:04) [8]


> И. Павел ©   (28.06.10 14:57) [7]

> А сама система внутри run генерирует только потомки exception?

Переобоснуй.
Если имеется ввиду RTL, то она транслирует системные исключения
в дельфийские (потомки Exception) при uses SysUtils, ЕМНИП.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-06-28 15:12) [9]


> Leonid Troyanovsky ©   (28.06.10 15:04) [8]

> в дельфийские (потомки Exception) при uses SysUtils, ЕМНИП.

Про uses я погнал, sorry, но, все равно, не то, про что спрашивали.

> И. Павел ©   (28.06.10 14:57) [7]

Сформулируй ясней, можно с примером.

--
Regards, LVT.


 
И. Павел ©   (2010-06-28 15:37) [10]

> Сформулируй ясней, можно с примером.
>Достаточно просто не вызывать ее.

Все ошибки в run попадают в HandleException.

procedure TApplication.HandleException(Sender: TObject);
begin
 if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
 if ExceptObject is Exception then
 begin
   if not (ExceptObject is EAbort) then
     if Assigned(FOnException) then
       FOnException(Sender, Exception(ExceptObject))
     else
       ShowException(Exception(ExceptObject));
 end else
   SysUtils.ShowException(ExceptObject, ExceptAddr);
end;


Они все пройдут в if ExceptObject is Exception then ..., тоесть else написан только на тот случай, если пользователь решит написать raise TForm1.Create?


 
Leonid Troyanovsky ©   (2010-06-28 15:51) [11]


> И. Павел ©   (28.06.10 15:37) [10]

> Они все пройдут в if ExceptObject is Exception then ...,
>  тоесть else написан только на тот случай, если пользователь
> решит написать raise TForm1.Create?

Видимо, так :)
Но, главное, что б ничего из исключений не терялось.

--
Regards, LVT.


 
sniknik ©   (2010-06-28 15:54) [12]

> если пользователь решит написать raise TForm1.Create?
а дойдет ли тут до ексепта? скорее еще компилятор "зарубит".


 
И. Павел ©   (2010-06-28 15:59) [13]

> Leonid Troyanovsky ©

Спасибо.


> sniknik ©

Да, это я параметр забыл :)


 
Leonid Troyanovsky ©   (2010-06-28 16:02) [14]


> sniknik ©   (28.06.10 15:54) [12]

> > если пользователь решит написать raise TForm1.Create?
> а дойдет ли тут до ексепта? скорее еще компилятор "зарубит".

Доходит (D6).
И автоматически удаляется после обработки "исключения".

--
Regards, LVT.


 
Игорь Шевченко ©   (2010-06-28 16:35) [15]


> а дойдет ли тут до ексепта?


куда денется ? скомпилируй, запусти, оно даже возбудится



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
15-1277096188
tipman
2010-06-21 08:56
2010.09.19
Выпадающая таблица или таблица в ComboBox


15-1277197697
ixen
2010-06-22 13:08
2010.09.19
Клиент delphimaster


11-1222972796
Rocket
2008-10-02 22:39
2010.09.19
Утечка памяти при динамическом создании форм и UNICODE_CTRLS


15-1277349628
ixen
2010-06-24 07:20
2010.09.19
Не запускается программа. В чем может быть причина?


15-1277099793
12
2010-06-21 09:56
2010.09.19
Ошибка AV на строке TRY. Что за ерунда?