![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Исключение EConvertError c SInvalidDateTime [D4, WinXP]
Германн © (2005-10-15 00:53:00)Ткните меня плиииз носом в дерьмо, если кто знает как подобное исключение может выдаваться в таком варианте:
try
FieldByName('EvDateTime').AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
except
on EConvertError do
FieldByName('EvDateTime').AsDateTime:=StrToDateTime('01.01.80 00:00');
end;
или в таком
try
FieldByName('EvDateTime').AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
except
FieldByName('EvDateTime').AsDateTime:=StrToDateTime('01.01.80 00:00');
end;
P.S. работа не под отладчиком.
Проверил всю свою программу. Явно, функция StrToDateTime вызывается только там. Неявные её вызовы, вроде бы, в программе отсутствуют. (XXX:=TStringField.AsDateTime не пользую. TDateTimeField.AsString:=... - то же. Фильтр на таблицу - то же не использую. Это все возможные вызовы StrToDateTime, которые я накопал в Delphi\Source. Есть ещё, правда и IniFiles, но это я исключил, поскольку в нём я не использую ДатуВремя.
P.P.S.
Нифига не понял, зачем было в Consts объявлять ещё раз константу SInvalidDateTime, которая уже объявлена в SysConsts, но с другим форматом вывода!
Германн (2005-10-16 20:33:00) [1]2 sniknik © (16.10.05 20:16) [32]
> не может этого быть, чтобы не глушилось...
(Грустно) Вот и я об том же :(
> ищи глюки в своем коде.
Ищу. Но не нахожу пока.
sniknik (2005-10-16 20:16:00) [2]это ты сути ответов не понял. пришла лажа? - обрабатывай! сам генери исключения по этому поводу. не плоди кучи преобразований которые поотенциально источники глюков. не думай что в обработчике ошибки не может возникнуть другой ошибки, ведь у тебя и там преобразования (OnException тоже касается).
и т.д. ищи глюки в своемкоде.
а на try except не греши, не может этого быть, чтобы не глушилось... потоков же у тебя в них нет, насколько код приведен. (если из зашишенного блока вызов потока/сом обьекта, и уже в нем исключение... имхо, это единственная возможность "упустить" исключение из блока)
и кстати. этой "сути" в вопросе нет, только в дополнениях. а это не равнозначно, потому что изначально тебе на другое отвечали.
Германн (2005-10-16 19:52:00) [3]2 sniknik © (16.10.05 19:47) [30]
Не ну ты суть вопроса не понял. То что у меня в функцию StrToDateTime передаётся неверная строка это очевидно. С прибора пришла лажа, бывает. Меня то волнует почему происходящее при этом исключение не глушится в защищённом блоке.
sniknik (2005-10-16 19:47:00) [4]> У меня такой нет!
ну так вот и сделай. тогда вообще отпадет надобность в последующем конвертировании.
и я указывал, я спросил
> что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?
если ты одну придумал, то значит и другую сможеш. более правильную. т.к. операции с числами от форматов не зависят.
Германн (2005-10-16 19:36:00) [5]2 sniknik © (16.10.05 19:09) [28]
Да я вообще и не думал искать какие-то ошибки в стандартной StrToDateTime!
Я ищу варианты невозможного. Как исключение произощедшее внутри защищённого блока всё-таки вылезло из оного наружу.
Кстати а что это за BCDDateTimeToDateTime, которую ты уже не первый раз указываешь? У меня такой нет!
А если ты про мою BCDDateTimeToStr то вот её текст:
function BCD2Byte(BCD: Byte): Byte;
begin
BCD2Byte:=(BCD shr 4)*10+(BCD and $0F);
end;
function BCDDateTimeToStr(DT: BCDDateTime): String;
begin
Result:=LeftPad(IntToStr(BCD2Byte(DT[3])),'0',2)+'.'+LeftPad(IntToStr(BCD2Byte(DT[4])),'0',2)+'.'+
LeftPad(IntToStr(BCD2Byte(DT[5])),'0',2)+' '+LeftPad(IntToStr(BCD2Byte(DT[2])),'0',2)+':'+
LeftPad(IntToStr(BCD2Byte(DT[1])),'0',2)+':'+LeftPad(IntToStr(BCD2Byte(DT[0])),'0',2);
end;
sniknik (2005-10-16 19:09:00) [6]смысл? ну если ты не видиш смысла в более точной локализации места глюка... и продолжаеш искать его в стандартной StrToDateTime. вместо поиска своего кода порождающего эту пустую строку. пример подобного кода и был дан.
и естественно он в принципе не приводит такой ситуации потому как это мойкод, а предполагается аналог в твоем, а в нем ты принципиально не ищеш. как и не делаеш посоветованных исправлений которые теоретически или вообше исключают глюки перевода строк в дату (BCDDateTimeToDateTime) либо позволяют исключить данный участок кода из "подозреваемых" > неважно (16.10.05 02:35) [19]
я вообще не знаю о чем тогда с тобой разговаривать. тяжолое это вообще дело, неблагодарное.
боюсь даже очередное предположение о безграмотности написания SaveLog которое присваевается OnException выдвигать... хотя это и может быть связано с глюком, но к хорошему не приведет, а только к очередной скандальной зашите "родного" кода. не стоит в общем.
хотя иногда и весело...
особенно это
> А Вы мне оплатите сию работу? Готов обсудить варианты!
оплату за поиски глюка в собственном коде требовать? с человека который вам помогает (пытается) абсоолютно бескорыстно... круто. это ШЕДЕВР. достойный занесения в анналы местной ореховой рощи. имхо.
Германн (2005-10-16 17:15:00) [7]2 sniknik © (16.10.05 11:19) [26]
Ну хорошо, хорошо допустим, что я ничего не хочу и т.д. и т.п.
Но в чём смысл примера
> ошибочного кода который может привести к подобного рода
> ошибке с пустой датой
, если он не может в принципепривести к к подобного рода
> ошибке с пустой датой будучи выполненным не под отладчиком?
sniknik (2005-10-16 11:19:00) [8]нда уж. ничего не хочеш менять, ничего не желаеш проверять, не показываеш то что просят, никакого диалога только раздраженные нападки на отвечающих, и хочеш точного ответа только на то, что тебе кажется важным... а ведь чаще всего ошибки не там где ищут а там где и не предполагают и важность савершенно в другом (была бы там где кажется, сам бы нашол. да и искать бы не пришлось ты ведь "знаеш" глюк вот тут. а отвечавшие тебя отвлекают, раздражают... в разные другие места тычут... "а там темно, а тебе удобнее искать под фонарем. пусть даже глюк перейдет в разряд нерешаемых "чудес", типа в дельфе ошибка").
дейстсвительно
> Ну Вас...
p.s.
Германн © (16.10.05 01:37) [16]
> т.е. сообщение об исключении выглядит так
> 29.09.2005 11:22:23-EConvertError : ' ' is not a valid date and time
важно, но поздно. (надоело)
пример ошибочногокода который может привести к подобного рода ошибке с пустой датой. "забыта" инициализация всех нужных параметров
procedure TForm1.Button1Click(Sender: TObject);
var
TempDate: TDateTime;
function BCDDateTimeToStr(dt: TDateTime): string;
var
FormatSettings: TFormatSettings;
begin
FormatSettings.DateSeparator:= '/';
result:= DateTimeToStr(dt, FormatSettings);;
end;
begin
try
TempDate:= StrToDateTime(BCDDateTimeToStr(Now()));
except
on EConvertError do
TempDate:= StrToDateTime('01.01.80 00:00');
end;
end;
но это конечно не вывалится. т.к. это опять догадка.
неважно (2005-10-16 03:28:00) [9]2 Германн © (16.10.05 03:08) [24]
>Меня не интересует реализация [19]
Странно. Да хотя бы просто убедится и все... сообщить нам результат.
>А Вы мне оплатите сию работу?
А я тут при чем? Я почему предложил...дело в том,что на borland.public.delphi частенько пишут о различных bug-фиксах.Точно помню,что был такой при использовании IBX.Возникал при переводе\установке даты\времени. Как раз на 4!!!
З.Ы. Нельзя быть таким ЗЛЫМ. Что я Вам сделал??? Я просто хотел помочь. Ну Вас...
Германн (2005-10-16 03:08:00) [10]2 неважно (16.10.05 02:54) [23]
>>А что это меняет в "осмыслении причин сабжа"?
>Многое. Если [19] выполняется,то ошибка явно в формате.
Ну опять дважды-два! :(
Меня не интересует реализация [19].
>З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.
А Вы мне оплатите сию работу? Готов обсудить варианты!
неважно (2005-10-16 02:54:00) [11]>А что это меняет в "осмыслении причин сабжа"?
Многое. Если [19] выполняется,то ошибка явно в формате.
З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.
Германн (2005-10-16 02:48:00) [12]2 неважно (16.10.05 02:38) [20]
> Кстати,Вы так и не показали проверяете ли Вы формат даты\времени?
> ?? Какие настройки в ОС???
Имхо, на сей вопрос я уже ответил.
Германн (2005-10-16 02:44:00) [13]2 неважно (16.10.05 02:35) [19]
А что это меняет в "осмыслении причин сабжа"?
неважно (2005-10-16 02:38:00) [14]Кстати,Вы так и не показали проверяете ли Вы формат даты\времени??? Какие настройки в ОС??? Может Вам надо так :
StrToDateTime('01.01.80 00:00 PM'); // или
StrToDateTime('01.01.80 00:00 AM');
неважно (2005-10-16 02:35:00) [15]
try
FieldByName('EvDateTime').AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
except
FieldByName('EvDateTime').AsDateTime:=Now
end;
А так? Тоже исключение???
Германн (2005-10-16 02:11:00) [16]2 GuAV © (16.10.05 01:54) [17]
> Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только
> 2 штуки ? Может быть except получился относящимся к другому
> try...
ДА. Только "Copy&Paste" и "только две штуки".
> Точно ли исполняется этот код, а не другая копия ?
Да.
> Память под строки не затирается (признаком чего м.б. AV
> и INvalidPointer при выходе) ?
Лог-файл, ведение которого я описал в [16] свидетельствует, что ни AV, ни ещё чего нибудь нет. Указанная процедура вызывается в Application.OnException.
GuAV (2005-10-16 01:54:00) [17]Даже не знаю..
Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только 2 штуки ? Может быть except получился относящимся к другому try...
Точно ли исполняется этот код, а не другая копия ?
Память под строки не затирается (признаком чего м.б. AV и INvalidPointer при выходе) ?
Германн (2005-10-16 01:37:00) [18]2 beglec (16.10.05 00:47) [14]
2 sniknik © (16.10.05 00:56) [15]
Сначала вам обоим. Да обсуждаемая прога написана не очень корректно. Но уж так сложилось исторически. Но в ответе:
> Германн © (15.10.05 02:39) [3]
>
> 2 GuAV © (15.10.05 02:23) [1]
>
> Запоминать дату тут нет нужды. В тексте исключения приведено:
> ' ', т.е. пробел.
>
т.е. сообщение об исключении выглядит так
29.09.2005 11:22:23-EConvertError : ' ' is not a valid date and time
Это запись из лог-файла, который записывается моей программой следущим образом :
procedure TFMain.SaveLog(E: Exception; EStr, PlaceSt: String);
var
i : Integer;
FT : TextFile;
St : String;
begin
St:=ChangeFileExt(Application.ExeName,'.'+FormatDateTime('yymm',Now)+'.log.txt');
AssignFile(FT,St);
if FileExists(St) then Append(FT) else ReWrite(FT);
if E <> nil then begin
St:=DateTimeToStr(Now)+'-'+ E.ClassName+' : '+E.Message;
Writeln(FT,St);
end;
... тут следуют некие проверки E.ClassName и особые реакции на некоторые их них
Вы пробовали получить такое сообщение об ошибке при вызове StrToDateTime('01.01.80 00:00') с неправильными DateSeparator или
TimeSeparator? Имхл нет. Поскольку тогда бы сообщение об ошибке выглядело бы так:
29.09.2005 11:22:23-EConvertError : '01.01.80 00:00' is not a valid date and time
Теперь лично к sniknik © (16.10.05 00:56) [15]
> а где же ты это ищеш? сам то перечитай свой вопрос. или "как всегда"
пишем одно, на уме другое?
В программе возникает исключение указанное в сабже. Прошерстил исходники идущие с Д4. Нашел, что данное исключение вызывается только в функции StrToDateTime. Прошерстил исходники своей программы.StrToDateTime вызывается только в тех двух случаях, которые указаны в вопросе. (Это я проясняю термин "явный вызов".) Далее прошерстил снова исходники Дельфи на предмет вызова сей функции внутри VCL или RTL. Нашел несколько этих вызовов. Убедился, что они в моей программе не испльзуются. (Это я пояснил термин "неявный вызов".)
Вот поэтому-то "Я ищу Как ёклмн Исключение указанное в сабже вылезло из блока try except end." :(
sniknik (2005-10-16 00:56:00) [19]Германн © (16.10.05 00:02) [13]
> Не ищу я ошибки в стандартной StrToDateTime!
а где же ты это ищеш? сам то перечитай свой вопрос. или "как всегда" пишем одно, на уме другое?
> Я ищу Как ёклмн Исключение указанное в сабже вылезло из
> блока try except end. Кстати в той самой моей функции происходит
> как раз преобразование данных в строку.
ну так ёклмнищи это в своей функции! то что ты ее не приводиш конечно должно нас уверить что она идеальна, и написана безукоризненно....
и кстати покажи мне в вопросе где написано то что написано в [13]. перечитал еше раз и не нашол там ничего о выходе исключения за блок... видать это в прикрепленной телепатограмме.
по ответу, раз непонятно, коментарий кодом (примерный сценарий разумеется)
procedure TForm1.Button1Click(Sender: TObject);
var
TempDate: TDateTime;
function BCDDateTimeToStr(dt: TDateTime): string;
begin
DateSeparator:= '/';
result:= DateTimeToStr(dt);
end;
begin
try
TempDate:= StrToDateTime(BCDDateTimeToStr(Now()));
except
on EConvertError do
TempDate:= StrToDateTime('01.01.80 00:00');
end;
end;
вот это к примеру гарантированновыйдет за блок try except т.к. вызовет двойное исключение сначала в блоке а после в обработке исключения.
beglec (2005-10-16 00:47:00) [20]это тебе и пытаются объяснить что случаев может быть множетсво и не только тут
но внимательно прочитав суть твоего вопроса и написанный код "запудырил" следующее :)
try
FieldByName('EvDateTime').AsDateTime:=StrToDateTime(BCDDateTimeToStrDt));
except
FieldByName('EvDateTime').AsDateTime:=StrToDateTime('01.01.80 00:00');шибка здесь
end;
Если шибка в этой строчке то тебе ни один Try Except не поможет - так что разбирайся
проблемы могут быть в следующей
1. в системе Windows используется разделитель [,] вместо [.] - самая распространенная ошибка. сам делаю постоянно.
2. не правильны формат записи даты - может быть первым указывает год и т.д. а 80 дня или месяца не бывает - сам понимаешь
3. скорее всего см. п.1.