Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "KOL";
Текущий архив: 2006.11.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.051 c
8-1141656784
Belorus
2006-03-06 17:53
2006.11.19
Медиа плеер.


9-1139153587
VolanD666
2006-02-05 18:33
2006.11.19
Collision Detection


15-1162028231
Leonid Troyanovsky
2006-10-28 13:37
2006.11.19
Любителям Forms in dll посвящяется


1-1160221931
AlexeyT
2006-10-07 15:52
2006.11.19
Перехватить клавиши в TWebBrowser


15-1162084362
MultiLang
2006-10-29 04:12
2006.11.19
Функция перевода файлов *.pas в структуру элементов языка ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский