Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Исключение EConvertError c SInvalidDateTime [D4, WinXP]


Страницы:   1 2

Германн ©   (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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо