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

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

обработка ошибок записи SaveToFile


User ©   (2008-07-17 16:24:00) 

как отловить, а главное - правильно отреагировать (программно) на ошибки записи (вчастности - нехватка места) при работе с процедурой SaveToFile. Пытаюсь что-то типа (в функции):

 Result:= True;
 try
   bmp.SaveToFile('A:\z\F.bmp');
 except
   on E: EStreamError do Result:= False;
 end; bmp.Free
...
Ошибка, вроде фиксируется, но не обрабатывается - файл всё равно создается (нулевой длины). Как с этим бороться?


Loginov Dmitry   (2008-07-18 15:31:00) [1]


> ShowMessage(SysErrorMessage(GetLastError)) - вот это не
> всегда срабатывает


Она всегда срабатывает, причем так, как и должна, в соответствии с документацией.


Vlad Oshin   (2008-07-18 11:50:00) [2]

вот, например:
try
 ADOQuery1.ConnectionString:='';
 ADOQuery1.Active:=true;
except
on E: Exception do ShowMessage(SysErrorMessage(GetLastError)) ;
end;
"Операция успешно завешена"

try
 ADOQuery1.ConnectionString:='';
 ADOQuery1.Active:=true;
except
 on E: Exception do ShowMessage( GetErrorInfo(E,'ADOQuery1.Active:=true;') );
end;


Vlad Oshin   (2008-07-18 11:31:00) [3]

ShowMessage(SysErrorMessage(GetLastError)) - вот это не всегда срабатывает, иногда выскакивает в защищ.блоке сообщение вроде: Операция завершилась успешно. Например, если курсор (БД) не вернулся.

так делаю:

try
...
except
e: Exception do   ShowMessage(GetErrorInfo);
// e: Exception do   ShowMessage(GetErrorInfo, 'место в программе');
// e: Exception do   LogMessage(GetErrorInfo, 'место в программе');
end
============================
function GetErrorInfo(E:Exception; messages:string='No option'):string;
var
AStLst:TStringList;

function GetErrorHistory: string;
var
  ClassRef: TClass;
  s:string;
begin
  ClassRef := E.ClassType;
  s:='';
  s:=s+ClassRef.ClassName;
  ClassRef := ClassRef.ClassParent;
  while ClassRef.ClassName <> 'TObject' do
  begin
    s:=s+'->'+ClassRef.ClassName;
    ClassRef := ClassRef.ClassParent;
  end;
  result:=s;
end;
function GetCurrentUserName: string;
var
  BufferSize: DWORD;
  pUser: PChar;
begin
 result :='Error';
 BufferSize := 0;
 GetUserName(nil, BufferSize);
 pUser := StrAlloc(BufferSize);
 try
   GetUserName(pUser, BufferSize);
   result := StrPas(pUser);
 finally
   StrDispose(pUser);
 end;
end;

function GetComputerNetName: string;
var
 buffer: array[0..255] of char;
 size: dword;
begin
 size := 256;
 if GetComputerName(buffer, size)
  then Result := buffer
  else Result := ''
end;

begin
AStLst:=TStringList.Create;
result:='Error';
AStLst.Clear;
AStLst.Add('-------- PC info ---------');
AStLst.Add(' PC   name : '+' "'+GetComputerNetName+'"');
AStLst.Add(' User name : '+' "'+GetCurrentUserName+'"');
AStLst.Add('-------- Error info ------');
AStLst.Add('File  name : '+' "'+Application.ExeName+'"');
AStLst.Add('Class Error: '+' "'+GetErrorHistory+'"');
AStLst.Add('Text Error : '+' "'+E.Message+'"');
AStLst.Add('Options    : '+' "'+messages+'"');
AStLst.Add('-------- ErrorEX info ------');
......... много текста, мудреж с TypInfo
result:=AstLst.GetText;
end;


User   (2008-07-17 23:51:00) [4]

вместо DeleteFileприменил
 if FindFirst(FileName, faAnyFile, SRec) = 0 then begin
   if SRec.Size = 0 then DeleteFile(FileName)
 end

... как уже отмечалось SaveToFileне вызывает ошибки при нехватке места, просто пустой файл ... Ошибки вызывала защита дискеты от записи ...
> Никогда не следует подменять оригинальный текст ошибки своим,
>  зачастую взятым с потолка, текстом.

- "Цезарю - цезарево ...", в обработчик ошибок я не лезу (о чем уже говорилось в [6]) ...


Loginov Dmitry   (2008-07-17 23:30:00) [5]


> На счет сообщений - как минимум, выскакивает сообщение (для
> примера для дискеты) о том что, возможно ... защищен ...
>  продолжить ... отменить ....


Показывай пользователю оригинальный текст ошибки:

ShowMessage(SysErrorMessage(GetLastError))

Никогда не следует подменять оригинальный текст ошибки своим, зачастую взятым с потолка, текстом.


User   (2008-07-17 22:08:00) [6]

... продолжим ;-)
как оказалось - " нехватка места" - для SaveToFileвовсе при не ошибка, во всяком случае exceptэто не ловит.


User   (2008-07-17 19:02:00) [7]

без делета не ругается, ...
попытка прописать делет при ошибке > on E: EStreamError do Result:= False;не дала результата - наверное Result = True ...


Поросенок Винни-Пух   (2008-07-17 18:45:00) [8]

а он ли ругается?


User   (2008-07-17 18:37:00) [9]

DeleteFileне заметил ... -> ругается на "invalid pointer operation", файлики не удаляет ...


Dennis I. Komarov   (2008-07-17 18:03:00) [10]

> Я знаю, что я буду делать, если не хватает места ...

не-е. Ты будешь писать код...

> А чево > ну и?

И чем тебе [2] не угодил?


User   (2008-07-17 17:49:00) [11]

А чево > ну и?? Я знаю, что я буду делать, если не хватает места ...
Код из функции (результат boolean - удачно - не_удачно), функция в DLL ( ... яйцо в утке, утка в зайце ...;-). По задумке файл либо сохраняется, либо не сохраняется.
На счет сообщений - как минимум, выскакивает сообщение (для примера для дискеты) о том что, возможно ... защищен ... продолжить ... отменить .... Необходимости в дублировании нет, разве что, перехватив Виндовское сообщения, выдать свое, я так думаю ... (с)


Dennis I. Komarov   (2008-07-17 17:26:00) [12]

> [6] User   (17.07.08 16:58)

ну и?


Игорь Шевченко   (2008-07-17 17:01:00) [13]


> попутно можно вывести сообщение об ошибке - но этими сообщениями
> так обилует Виндоуз, то это может быть и лишним


Да, все сообщения об ошибках - это лишнее. Пусть пользователь сам репу почешет, после того, как у него без единого сообщения исчезли все данные.


User   (2008-07-17 16:58:00) [14]


> Коряво - это ловить только EStreamError  и не иметь finally.

- прошу прощения, как совместить exceptи finally?
Типа
try
 try
   bmp.SaveToFile('A:\z\F.bmp');
 except
   on E: EStreamError do Result:= False;
 end;
finally
 bmp.Free
end;
?
> Сперва реши чего надо делать если нет места...- ну простейший вариант - не сохранять ничего (попутно можно вывести сообщение об ошибке - но этими сообщениями так обилует Виндоуз, то это может быть и лишним).


Dennis I. Komarov   (2008-07-17 16:46:00) [15]

> [3] User   (17.07.08 16:37)

Сперва реши чего надо делать если нет места...


Поросенок Винни-Пух   (2008-07-17 16:38:00) [16]

но это как-то коряво ...

Коряво - это ловить только EStreamError  и не иметь finally.
Вот это точно коряво.


User   (2008-07-17 16:37:00) [17]

> c чем именно?- с тем, что файл создается, таже в том случае, если недостаточно места на диске(тке) / флешке (иже с ними ...) для полноценного сохранения данных (в данном случае - графический файл).
Как вариант - можно проверять наличие файла, и, при нахождении такого, удалять, но это как-то коряво ...


Dennis I. Komarov   (2008-07-17 16:29:00) [18]

> Result:= True;
> try
>   bmp.SaveToFile('A:\z\F.bmp');
> except
   DeleteFile('A:\z\F.bmp');
>   //on E: EStreamError do Result:= False;
> end; bmp.Free


Поросенок Винни-Пух   (2008-07-17 16:27:00) [19]

c чем именно?


Наверх

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