Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
ВнизОбщий обработчик ошибок, завершающий программу. Найти похожие ветки
← →
И. Павел © (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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c