Форум: "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