Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
ВнизИсключение EConvertError c SInvalidDateTime Найти похожие ветки
← →
Германн © (2005-10-15 00:53) [0]Ткните меня плиииз носом в дерьмо, если кто знает как подобное исключение может выдаваться в таком варианте:
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, но с другим форматом вывода!
← →
GuAV © (2005-10-15 02:23) [1]Да хотя бы так:
DateSeparator := "/";
StrToDateTime("01.01.80 00:00");
Причём, DateSeparator изначально берётся из настроек системы, поэтому поведение может различатся на различных машинах.
В D7 я бы порекомендовал другую overloaded версию. В данном случае, видимо, следует явно задать DateSeparator или писать дату числом (const 01_01_80__18_00=29221).
Может исключение и не здесь. Следовало бы запомнить дату, указанную в тескте исключения.
← →
GuAV © (2005-10-15 02:30) [2]
> Это все возможные вызовы StrToDateTime, которые я
> накопал в Delphi\Source.
А варианты ? Или их в четвёрке ещё нет ?
← →
Германн © (2005-10-15 02:39) [3]2 GuAV © (15.10.05 02:23) [1]
Запоминать дату тут нет нужды. В тексте исключения приведено: " ", т.е. пробел.
← →
Германн © (2005-10-15 02:43) [4]
> GuAV © (15.10.05 02:30) [2]
>
>
> > Это все возможные вызовы StrToDateTime, которые я
> > накопал в Delphi\Source.
>
>
> А варианты ? Или их в четвёрке ещё нет ?
>
Не понял! Это ты об чём?
← →
GuAV © (2005-10-15 02:45) [5]Тогда два варианта. Или следует поискать вызовы ещё, или настолько тяжелый (и невероятный) случай, что память под константу портится. У меня, ктати grep search выдал много результатов, не только IniFiles.
← →
GuAV © (2005-10-15 02:46) [6]
>> А варианты ? Или их в четвёрке ещё нет ?
>>
>
>
> Не понял! Это ты об чём?
D:\Program Files\Borland\Delphi7\Source\Indy\IdFTPList.pas
362 AItem.ModifiedDate := StrToDateTime(LModified);
D:\Program Files\Borland\Delphi7\Source\Indy\IdGlobal.pas
209 function GmtOffsetStrToDateTime(S: string): TDateTime;
1228 function GmtOffsetStrToDateTime(S: string): TDateTime;
1257 DateTimeOffset := GmtOffsetStrToDateTime(S);
D:\Program Files\Borland\Delphi7\Source\Rtl\Common\IniFiles.pas
225 Result := StrToDateTime(DateStr);
D:\Program Files\Borland\Delphi7\Source\Rtl\Sys\SysUtils.pas
2248 { StrToDateTime converts the given string to a date and time value. The
2253 function StrToDateTime(const S: string): TDateTime; overload;
2254 function StrToDateTime(const S: string;
2257 function StrToDateTimeDef(const S: string;
2259 function StrToDateTimeDef(const S: string; const Default: TDateTime;
2262 function TryStrToDateTime(const S: string;
2264 function TryStrToDateTime(const S: string; out Value: TDateTime;
2375 ""at" hh:mm AM/PM", StrToDateTime("2/15/95 10:30am"));
12650 function StrToDateTime(const S: string): TDateTime;
12652 if not TryStrToDateTime(S, Result) then
12656 function StrToDateTime(const S: string;
12659 if not TryStrToDateTime(S, Result, FormatSettings) then
12663 function StrToDateTimeDef(const S: string; const Default: TDateTime): TDateTime;
12665 if not TryStrToDateTime(S, Result) then
12669 function StrToDateTimeDef(const S: string; const Default: TDateTime;
12672 if not TryStrToDateTime(S, Result, FormatSettings) then
12676 function TryStrToDateTime(const S: string; out Value: TDateTime): Boolean;
12696 function TryStrToDateTime(const S: string; out Value: TDateTime;
D:\Program Files\Borland\Delphi7\Source\Rtl\Sys\VarUtils.pas
795 Dest.VDate := StrToDateTime(WideString(LSource.VOleStr));
1133 Result := CResult[TryStrToDateTime(strIn, dateOut)];
D:\Program Files\Borland\Delphi7\Source\ToolsAPI\DesignEditors.pas
1963 else DT := StrToDateTime(Value);
D:\Program Files\Borland\Delphi7\Source\Vcl\ComCtrls.pas
21517 DT := StrToDateTime(pszUserString);
D:\Program Files\Borland\Delphi7\Source\Vcl\DB.pas
4317 Result := StrToDateTime(GetAsString);
5160 DateTime := StrToDateTime(Value);
D:\Program Files\Borland\Delphi7\Source\Vcl\DBCommon.pas
927 DateTime := StrToDateTime(string(TVarData(Value).VString)) else
D:\Program Files\Borland\Delphi7\Source\Vcl\IBSQL.pas
1241 SetAsDateTime(StrToDateTime(Value))
D:\Program Files\Borland\Delphi7\Source\Vcl\SqlTimSt.pas
609 Result := TryStrToDateTime(S, DT);
D:\Program Files\Borland\Delphi7\Source\WebSnap\xmlutil.pas
562 Date := StrToDateTime(DateStr);
← →
GuAV © (2005-10-15 02:57) [7]FloatToDateTime и EncodeDateTime, DecodeDateTime из DateUtils тоже понимают это исключение, а
← →
Германн © (2005-10-15 03:01) [8]2 GuAV © (15.10.05 02:46) [6]
Ну, так это же от Д7. А у меня Д4.
2 GuAV © (15.10.05 02:45) [5]
>Или следует поискать вызовы ещё, или настолько тяжелый (и невероятный) случай, что память под константу портится.
Имхо, может и портится, но как?
← →
Германн © (2005-10-15 03:12) [9]2 GuAV © (15.10.05 02:57) [7]
Ну дык ещё раз! В Д4 - оборзел, тьфу ты, обозрел :) всё, что смог! Но ничего не нашёл!
← →
sniknik © (2005-10-15 14:45) [10]что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?
← →
Германн © (2005-10-15 18:54) [11]2 sniknik © (15.10.05 14:45) [10]
Не. BCDDateTimeToStr - это моя собственная.
← →
sniknik © (2005-10-15 19:47) [12]> это моя собственная.
aaa... а ошибку значит ищеш в стандартной, проверенной многими и многими ее использовавшими...
> ... Явно, функция StrToDateTime вызывается только там. Неявные её вызовы ...
========================================
- гражданин, чего это вы тут под фанарем на карачках ползаете?
- да, я там в подворотне десятку потерял, вот ищу...
- чего вы ее здесь ищете? если там потеряли.
- а здесь светлее!
← →
Германн © (2005-10-16 00:02) [13]sniknik © (15.10.05 19:47) [12]
> > это моя собственная.
> aaa... а ошибку значит ищеш в стандартной, проверенной многими
> и многими ее использовавшими...
> > ... Явно, функция StrToDateTime вызывается только там.
> Неявные её вызовы ...
Блин, ну ты и написал. Вопрос то хоть прочёл? Или "как всегда"?
Не ищу я ошибки в стандартной StrToDateTime!
Я ищу Как ёклмн Исключение указанное в сабже вылезло из блока try except end. Кстати в той самой моей функции происходит как раз преобразование данных в строку.
← →
beglec (2005-10-16 00:47) [14]это тебе и пытаются объяснить что случаев может быть множетсво и не только тут
но внимательно прочитав суть твоего вопроса и написанный код "запудырил" следующее :)
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.
← →
sniknik © (2005-10-16 00:56) [15]Германн © (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 т.к. вызовет двойное исключение сначала в блоке а после в обработке исключения.
← →
Германн © (2005-10-16 01:37) [16]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." :(
← →
GuAV © (2005-10-16 01:54) [17]Даже не знаю..
Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только 2 штуки ? Может быть except получился относящимся к другому try...
Точно ли исполняется этот код, а не другая копия ?
Память под строки не затирается (признаком чего м.б. AV и INvalidPointer при выходе) ?
← →
Германн © (2005-10-16 02:11) [18]2 GuAV © (16.10.05 01:54) [17]
> Код из [0] был приведен Ctrl+C, Ctrl+V и употреблений только
> 2 штуки ? Может быть except получился относящимся к другому
> try...
ДА. Только "Copy&Paste" и "только две штуки".
> Точно ли исполняется этот код, а не другая копия ?
Да.
> Память под строки не затирается (признаком чего м.б. AV
> и INvalidPointer при выходе) ?
Лог-файл, ведение которого я описал в [16] свидетельствует, что ни AV, ни ещё чего нибудь нет. Указанная процедура вызывается в Application.OnException.
← →
неважно (2005-10-16 02:35) [19]
try
FieldByName("EvDateTime").AsDateTime:=StrToDateTime(BCDDateTimeToStr(Dt));
except
FieldByName("EvDateTime").AsDateTime:=Now
end;
А так? Тоже исключение???
← →
неважно (2005-10-16 02:38) [20]Кстати,Вы так и не показали проверяете ли Вы формат даты\времени??? Какие настройки в ОС??? Может Вам надо так :
StrToDateTime("01.01.80 00:00 PM"); // или
StrToDateTime("01.01.80 00:00 AM");
← →
Германн © (2005-10-16 02:44) [21]2 неважно (16.10.05 02:35) [19]
А что это меняет в "осмыслении причин сабжа"?
← →
Германн © (2005-10-16 02:48) [22]2 неважно (16.10.05 02:38) [20]
> Кстати,Вы так и не показали проверяете ли Вы формат даты\времени?
> ?? Какие настройки в ОС???
Имхо, на сей вопрос я уже ответил.
← →
неважно (2005-10-16 02:54) [23]>А что это меняет в "осмыслении причин сабжа"?
Многое. Если [19] выполняется,то ошибка явно в формате.
З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.
← →
Германн © (2005-10-16 03:08) [24]2 неважно (16.10.05 02:54) [23]
>>А что это меняет в "осмыслении причин сабжа"?
>Многое. Если [19] выполняется,то ошибка явно в формате.
Ну опять дважды-два! :(
Меня не интересует реализация [19].
>З.Ы. В конце концов,проверьте Ваш сабж на более поздних версия D.
А Вы мне оплатите сию работу? Готов обсудить варианты!
← →
неважно (2005-10-16 03:28) [25]2 Германн © (16.10.05 03:08) [24]
>Меня не интересует реализация [19]
Странно. Да хотя бы просто убедится и все... сообщить нам результат.
>А Вы мне оплатите сию работу?
А я тут при чем? Я почему предложил...дело в том,что на borland.public.delphi частенько пишут о различных bug-фиксах.Точно помню,что был такой при использовании IBX.Возникал при переводе\установке даты\времени. Как раз на 4!!!
З.Ы. Нельзя быть таким ЗЛЫМ. Что я Вам сделал??? Я просто хотел помочь. Ну Вас...
← →
sniknik © (2005-10-16 11:19) [26]нда уж. ничего не хочеш менять, ничего не желаеш проверять, не показываеш то что просят, никакого диалога только раздраженные нападки на отвечающих, и хочеш точного ответа только на то, что тебе кажется важным... а ведь чаще всего ошибки не там где ищут а там где и не предполагают и важность савершенно в другом (была бы там где кажется, сам бы нашол. да и искать бы не пришлось ты ведь "знаеш" глюк вот тут. а отвечавшие тебя отвлекают, раздражают... в разные другие места тычут... "а там темно, а тебе удобнее искать под фонарем. пусть даже глюк перейдет в разряд нерешаемых "чудес", типа в дельфе ошибка").
дейстсвительно
> Ну Вас...
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 17:15) [27]2 sniknik © (16.10.05 11:19) [26]
Ну хорошо, хорошо допустим, что я ничего не хочу и т.д. и т.п.
Но в чём смысл примера
> ошибочного кода который может привести к подобного рода
> ошибке с пустой датой
, если он не может в принципе привести к к подобного рода
> ошибке с пустой датой будучи выполненным не под отладчиком?
← →
sniknik © (2005-10-16 19:09) [28]смысл? ну если ты не видиш смысла в более точной локализации места глюка... и продолжаеш искать его в стандартной StrToDateTime. вместо поиска своего кода порождающего эту пустую строку. пример подобного кода и был дан.
и естественно он в принципе не приводит такой ситуации потому как это мой код, а предполагается аналог в твоем, а в нем ты принципиально не ищеш. как и не делаеш посоветованных исправлений которые теоретически или вообше исключают глюки перевода строк в дату (BCDDateTimeToDateTime) либо позволяют исключить данный участок кода из "подозреваемых" > неважно (16.10.05 02:35) [19]
я вообще не знаю о чем тогда с тобой разговаривать. тяжолое это вообще дело, неблагодарное.
боюсь даже очередное предположение о безграмотности написания SaveLog которое присваевается OnException выдвигать... хотя это и может быть связано с глюком, но к хорошему не приведет, а только к очередной скандальной зашите "родного" кода. не стоит в общем.
хотя иногда и весело...
особенно это
> А Вы мне оплатите сию работу? Готов обсудить варианты!
оплату за поиски глюка в собственном коде требовать? с человека который вам помогает (пытается) абсоолютно бескорыстно... круто. это ШЕДЕВР. достойный занесения в анналы местной ореховой рощи. имхо.
← →
Германн © (2005-10-16 19:36) [29]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:47) [30]> У меня такой нет!
ну так вот и сделай. тогда вообще отпадет надобность в последующем конвертировании.
и я указывал, я спросил
> что за функция BCDDateTimeToStr? и нет ли там же где взял эту другой BCDDateTimeToDateTime?
если ты одну придумал, то значит и другую сможеш. более правильную. т.к. операции с числами от форматов не зависят.
← →
Германн © (2005-10-16 19:52) [31]2 sniknik © (16.10.05 19:47) [30]
Не ну ты суть вопроса не понял. То что у меня в функцию StrToDateTime передаётся неверная строка это очевидно. С прибора пришла лажа, бывает. Меня то волнует почему происходящее при этом исключение не глушится в защищённом блоке.
← →
sniknik © (2005-10-16 20:16) [32]это ты сути ответов не понял. пришла лажа? - обрабатывай! сам генери исключения по этому поводу. не плоди кучи преобразований которые поотенциально источники глюков. не думай что в обработчике ошибки не может возникнуть другой ошибки, ведь у тебя и там преобразования (OnException тоже касается).
и т.д. ищи глюки в своем коде.
а на try except не греши, не может этого быть, чтобы не глушилось... потоков же у тебя в них нет, насколько код приведен. (если из зашишенного блока вызов потока/сом обьекта, и уже в нем исключение... имхо, это единственная возможность "упустить" исключение из блока)
и кстати. этой "сути" в вопросе нет, только в дополнениях. а это не равнозначно, потому что изначально тебе на другое отвечали.
← →
Германн © (2005-10-16 20:33) [33]2 sniknik © (16.10.05 20:16) [32]
> не может этого быть, чтобы не глушилось...
(Грустно) Вот и я об том же :(
> ищи глюки в своем коде.
Ищу. Но не нахожу пока.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.037 c