Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Stream write error при TStringList.SaveToStream / 21 сообщений из 21, страница 1 из 1
23.03.2018, 12:07
    #39619394
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
В нижеприведенном коде при вызове UOCFGStringList.SaveToStream(Stream); при невыясненных обстоятельствах у некоторых пользователей иногда вылетает ошибка EWriteError с сообщением Stream write error.

И вторая, не связанная с первой, условия те же. При Stream.DisposeOf; (то, что в конце) вылетает EAccessViolation.

Я как только не крутил - не могу представить себе, как и из-за чего это может быть. Может кто-то сталкивался?

P.S. Дополнительные Stream создаются из-за fmShareDenyNone, которого нет в стандартном TStringList.SaveToFile. Т.к. файл с очень большой вероятностью может уже отрыт, то вот так делаю.

P.P.S. с первым стримом, который для чтения - проблем нет вообще.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
var Stream : TStream;

UOCFGStringList := TStringList.Create;
try
  Stream := nil;
  if FileExists(ClientDir + 'uo.cfg') then
    try
      Stream := TFileStream.Create(ClientDir + 'uo.cfg', fmShareDenyNone);
      UOCFGStringList.LoadFromStream(Stream);
    finally
      if Assigned(Stream) then Stream.DisposeOf;
    end;
  i := 0;
  while i < UOCFGStringList.Count do
  begin
    if UOCFGStringList.Strings[i].Contains('AcctID') then
      UOCFGStringList.Delete(i);
    if i >= UOCFGStringList.Count then Break;
    if UOCFGStringList.Strings[i].Contains('AcctPassword') then
      UOCFGStringList.Delete(i);
    if i >= UOCFGStringList.Count then Break;
    //...еще пять таких же
    Inc(i);
  end;

  UOCFGStringList.Add('AcctPassword=' + String(b));
  UOCFGStringList.Add('RememberAcctPW=on');

  try
    try
      if FileExists(ClientDir + 'uo.cfg') then
        Stream := TFileStream.Create(ClientDir + 'uo.cfg',
          fmOpenWrite + fmShareDenyNone)
      else
        Stream := TFileStream.Create(ClientDir + 'uo.cfg',
          fmCreate);
    except
      //обрабатываю ошибку
      Exit;
    end;
    UOCFGStringList.SaveToStream(Stream);
  finally
    if  Assigned(Stream) then Stream.DisposeOf;
  end;
finally
  UOCFGStringList.Free;
end;


На всякий случай приложил 2 репорта от эврики, с 2 ошибками.


Гуглил, в основном все сводится к багам VS и советам проверить хендл файла в process explorer.
...
Рейтинг: 0 / 0
23.03.2018, 13:43
    #39619492
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
жесть
...
Рейтинг: 0 / 0
23.03.2018, 13:57
    #39619516
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Наводящий вопрос: чем FreeAnd Nil отличается от .Free?
...
Рейтинг: 0 / 0
23.03.2018, 14:07
    #39619528
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
GunSmokerНаводящий вопрос: чем FreeAnd Nil отличается от .Free?

Во валит, а!
...
Рейтинг: 0 / 0
23.03.2018, 14:21
    #39619542
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
GunSmokerНаводящий вопрос: чем FreeAnd Nil отличается от .Free?

если это намек на то, что остается указатель на освобожденный класс остается после первого Stream.DisposeOf; и по какой-то причине не создается заново - так в блоке except для этого и стоит Exit.

Или я что-то не так понял?
...
Рейтинг: 0 / 0
23.03.2018, 14:26
    #39619545
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Окей, наводящий вопрос №2: выполняются ли блоки finally при Exit изнутри?
...
Рейтинг: 0 / 0
23.03.2018, 14:28
    #39619547
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
*задумался*
Не знаю.
а пойду-ка я проверю.
...
Рейтинг: 0 / 0
23.03.2018, 14:29
    #39619548
Tactical Nuclear Penguin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Vizit0r*задумался*
Не знаю.
а пойду-ка я проверю.

занавес
...
Рейтинг: 0 / 0
23.03.2018, 14:32
    #39619554
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Vizit0r*задумался*
Не знаю.
а пойду-ка я проверю.

Блок finally выполняется всегда.
...
Рейтинг: 0 / 0
23.03.2018, 19:14
    #39619794
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
понял, спасибо.

Порылся по коду, нашел сходу еще пару сомнительных мест, буду копать дальше.
...
Рейтинг: 0 / 0
23.03.2018, 21:06
    #39619833
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Vizit0r,

http://www.gunsmoker.ru/2018/03/riddle-23.html

:)

Я говорил, что лучше всегда использовать freeandnil. Даже локально. Но разве кто-то прислушивается? Ну ок, разгребайте баги тогда :)
...
Рейтинг: 0 / 0
23.03.2018, 21:13
    #39619835
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Vizit0rпонял, спасибо.

Порылся по коду, нашел сходу еще пару сомнительных мест, буду копать дальше.
1-е сомнительное место - в 8-й строчке кода. Она должна быть 6-й. Иначе очень возможно повторное другое исключение.
...
Рейтинг: 0 / 0
23.03.2018, 22:21
    #39619855
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
[quot YuRock]Vizit0r1-е сомнительное место - в 8-й строчке кода. Она должна быть 6-й. Иначе очень возможно повторное другое исключение.

уже.
...
Рейтинг: 0 / 0
23.03.2018, 22:28
    #39619857
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
makhaonVizit0r,

http://www.gunsmoker.ru/2018/03/riddle-23.html

:)

Я говорил, что лучше всегда использовать freeandnil. Даже локально. Но разве кто-то прислушивается? Ну ок, разгребайте баги тогда :)
В коде гансмокера проблема совсем не в отсутствии freeandnil а в кривых блоках try..finally.
...
Рейтинг: 0 / 0
23.03.2018, 22:32
    #39619859
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Надо так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var
  Stream: TFileStream;
begin
  Stream := nil;

  // что-то делаем

  Stream := TFileStream.Create({ ... });
  try
    // что-то делаем
  finally
    Stream.Free;
  end;

  Stream := TFileStream.Create({ ... });
  try
    // что-то делаем
  finally
    Stream.Free;
  end;
end;
...
Рейтинг: 0 / 0
23.03.2018, 22:34
    #39619860
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Причем необходимость Stream := nil; не очевидна.
...
Рейтинг: 0 / 0
24.03.2018, 10:47
    #39619927
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
makhaonVizit0r,

http://www.gunsmoker.ru/2018/03/riddle-23.html

:)

Я говорил, что лучше всегда использовать freeandnil. Даже локально. Но разве кто-то прислушивается? Ну ок, разгребайте баги тогда :)

http://www.nickhodges.com/post/Using-FreeAndNil.aspx

“If your code requires you to use FreeAndNil to reveal and easily find bugs, then your design is wrong. Good, clean code never feels the need to worry about errant pointers.”

Собственно, пример 21282207 это утверждение неплохо иллюстрирует.
...
Рейтинг: 0 / 0
26.03.2018, 10:05
    #39620357
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
schi http://www.nickhodges.com/post/Using-FreeAndNil.aspx

“If your code requires you to use FreeAndNil to reveal and easily find bugs, then your design is wrong. Good, clean code never feels the need to worry about errant pointers.”

Собственно, пример 21282207 это утверждение неплохо иллюстрирует.
Это не истина в последней инстанции, а мнение одного Ника, причем очень спорное.
...
Рейтинг: 0 / 0
26.03.2018, 10:45
    #39620380
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Василий №2,

FreeAndNil - один из инструментов, который помогает чистоте кода в том числе. Нравится людям зомби-ссылки хранить? Ну ок, хорошо :) Главное - что бы никому не навязывали.
...
Рейтинг: 0 / 0
26.03.2018, 17:28
    #39620652
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
makhaonFreeAndNil - один из инструментов, который помогает чистоте кода в том числе.
у гансмокера в блобах хорошая статья по этому поводу была. Может Алексей заглянет сюда и кинет ссылкой.
...
Рейтинг: 0 / 0
26.03.2018, 17:28
    #39620653
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Stream write error при TStringList.SaveToStream
Докв блобах
зарапортовался :)

... в блогах ...
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Stream write error при TStringList.SaveToStream / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]