Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.24;
Скачать: CL | DM;

Вниз

обработка ошибок записи SaveToFile   Найти похожие ветки 

 
User   (2008-07-17 16:24) [0]

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

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


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

c чем именно?


 
Dennis I. Komarov ©   (2008-07-17 16:29) [2]

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



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

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


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

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

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


 
Dennis I. Komarov ©   (2008-07-17 16:46) [5]

> [3] User   (17.07.08 16:37)

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


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


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

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


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


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


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


 
Dennis I. Komarov ©   (2008-07-17 17:26) [8]

> [6] User   (17.07.08 16:58)

ну и?


 
User   (2008-07-17 17:49) [9]

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


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

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

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

> А чево > ну и?

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


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

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


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

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


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

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


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

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


 
Loginov Dmitry ©   (2008-07-17 23:30) [15]


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


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

ShowMessage(SysErrorMessage(GetLastError))

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


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

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

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

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


 
Vlad Oshin ©   (2008-07-18 11:31) [17]

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;


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

вот, например:
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;


 
Loginov Dmitry ©   (2008-07-18 15:31) [19]


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


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



Страницы: 1 вся ветка

Текущий архив: 2008.08.24;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.02 c
2-1216282915
Артур Пирожков
2008-07-17 12:21
2008.08.24
Проблемы с Tidftp


15-1215335704
AndreyRus
2008-07-06 13:15
2008.08.24
Бесплатное хранилище архивов в Интернете.


15-1215115864
Petr V. Abramov
2008-07-04 00:11
2008.08.24
Как объяснить женщине


13-1120547588
Игорь Шевченко
2005-07-05 11:13
2008.08.24
Социологический опрос: нужен ли отдельный форум по .Net ?


15-1215576445
Slider007
2008-07-09 08:07
2008.08.24
С днем рождения ! 9 июля 2008 среда