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

Вниз

Обработка исключений   Найти похожие ветки 

 
homm ©   (2006-02-03 14:43) [0]

   try
       I := 0;
       J := 800;
       Form.width := j div I;
   except on E: Exception do
       ShowException(E, E.ExceptionRecord.ExceptionAddress);
   end;


Вываливается AV и приложение закрывается. Что я делаю не так?


 
homm ©   (2006-02-03 14:44) [1]

err естественно добавлен, первым в uses *.dpr. Замену system не использую.


 
Barloggg   (2006-02-03 15:31) [2]

бабахает на вот этой строчке
ShowException(E, E.ExceptionRecord.ExceptionAddress);
а в целом код работает.

где-то в уроках KOL что-то такое я видел, надо порыться...


 
Barloggg   (2006-02-03 15:37) [3]

О! нашел. вот что написано в доках в архиве err.pas

try ...
except on E: Exception do
 case E.Code of
 e_IntOverflow: HandleOverflow;
 e_DivBy0:      HandleZeroDivide;
 else           HandleOther;
 end;
end;


 
homm ©   (2006-02-03 15:44) [4]


> бабахает на вот этой строчке
Ну ты прям глаза мне открыл. Я тебе больше скажу. бабахает при подготовки параметров для вызова. А дерет он из стека. Значит вершина стека сбивается.


 
homm ©   (2006-02-03 15:45) [5]


> О! нашел. вот что написано в доках в архиве err.pas
Т.Е. произвольный код не допускается? Зачем тогда нужна ShowException


 
ECM ©   (2006-02-03 19:17) [6]

Хм... попробовал код из [0] у себя...(КОЛ 2.32, D6upd2, W2K3)
Работает, правда файл err.pas у меня оказался новее чем на сайте KOL.
У меня размер 35214 от 29.04.05. Возможно я сам что-то подправлял,
но кажется в каком-то из старых обновлений проскакивало обновление err.pas. Она лежит в архиве http://www.kolnmck.ru/files/kol_mck.zip
Но и "не обновленная" версия работает (но ShowException не определяет тип исключения - вместо Division by Zero - Access Violation...)
Еще я заметил такую нестыковку (возможно это характерно только для D6)
В функции ExceptionErrorMessage не совсем коректно передается первый параметр в функцию Format :
 StrCopy( Buffer, PChar( Format( Fmt, [ ExceptObject.ClassName,
          ModuleName, ConvertedAddress, MsgPtr, "" {MsgEnd}]) ) );

Fmt =  SException = "Exception %s in module %s at %p."#10"%s%s"
т.е. первый параметр должен быть либо String либо PChar.
А тут ExceptObject.ClassName : ShortString . Поэтому в результат попадает и первый байт с размером ClassName и вся память за ClassName (т.к. там нет завершающего нуля). Вылечить можно либо так:

StrCopy( Buffer, PChar( Format( Fmt, [ String(ExceptObject.ClassName),
          ModuleName, ConvertedAddress, MsgPtr, "" {MsgEnd}]) ) );

Либо (тут такой момент...Т.к. класс Exception - один и как описано в документации к err.pas наследников не должен иметь) то в результате строка всегда имеет вид "Exception Exception ....
так что этот параметр можно ИМХО и выбросить совсем
...
 SException = "Exception in module %s at %p."#10"%s%s";
...
 StrCopy( Buffer, PChar( Format( Fmt, [ ModuleName, ConvertedAddress,  MsgPtr, "" {MsgEnd}]) ) );


> .Е. произвольный код не допускается?


Почему? Все работает...


 
homm ©   (2006-02-03 19:33) [7]


> тут такой момент...Т.к. класс Exception - один и как описано
> в документации к err.pas наследников не должен иметь

Я че в err то полез - KOLODBC у меня тоже вылетает с AV. Дак там используется наследник от Exeption как раз.

Спасибо ECM. Переварю - напишу что узнал ;)


 
homm ©   (2006-02-03 20:22) [8]


> У меня размер 35214 от 29.04.05. Она лежит в архиве
> http://www.kolnmck.ru/files/kol_mck.zip

Спасиба, Заработало!

Кстати как дела с www.kolnmck.ru? Думаю может слить на kolnmck свои работы с homm86.narod да и закрыть эту глупую страницу. Примете мои проекты к себе?
Да. Подставу "На вопросы с форума также отвечает сам Владимир Кладов" с сайта обязательно надо убирать. У человека и так времени нет свободного (судя по тому что недели две его на форуме не слишком видно и на письма он не отвечает).


 
ECM ©   (2006-02-03 20:39) [9]


>  Дак там используется наследник от Exeption как раз

Да... второй способ не проходит  - только преобразование к String .
Можно таки сделать косметическое исправление:
SException = "Exception [%s] in module %s at %p."#10"%s%s"

> Примете мои проекты к себе?

Обязательно...и не только твои...:))


> "На вопросы с форума также отвечает сам Владимир Кладов"
> с сайта обязательно надо убирать


почему? вот только что он в соседней ветке ответил :))
и даже при его загруженности - он тут появляется достаточно часто
...там есть слово также


 
ECM ©   (2006-02-03 20:42) [10]


> Кстати как дела с www.kolnmck.ru?

Пока восстанавливаем разваленное...:))
... процесс идёт


 
homm ©   (2006-02-03 21:10) [11]

Кстати может кому интересно:
Вот так можно сделать если не обработку исключений, то хотябы их
отлов всего в 1,5кб даже с заменой system модулей.


function GetExceptionObject(P: PExceptionRecord): TObject;
begin
 Result := TObject.Create;
end;

procedure TForm1.Button1Click(Sender: PObj);
var     I: Integer;
       J: Integer;
begin
   try
       I := 0;
       J := 800;
       Form.width := j div I;
   except
       ShowMessage("Нехорошо");
   end;
end;

initialization
   ExceptionClass := TObject;
   ExceptObjProc := @GetExceptionObject;



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



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

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

Наверх




Память: 0.5 MB
Время: 0.034 c
1-1160060212
IDens
2006-10-05 18:56
2006.11.19
Как подождать завершение потока


2-1162652140
susergey
2006-11-04 17:55
2006.11.19
PageControl


15-1160868968
Кадр
2006-10-15 03:36
2006.11.19
Победит ли бесплатный OpenOffice жалкий платный MS Office ?


2-1162635752
Savek
2006-11-04 13:22
2006.11.19
TQRCompositeReport, количество страниц


2-1162664078
dbnz3
2006-11-04 21:14
2006.11.19
вопрос