Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];

Вниз

обработка ошибок записи 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.044 c
6-1191913609
Motzart_Motzart
2007-10-09 11:06
2008.08.24
Модем


4-1194957509
snake-as
2007-11-13 15:38
2008.08.24
Узнать класс окна


2-1216723921
Нов_и_чок
2008-07-22 14:52
2008.08.24
Программное выкл. компа


2-1216634583
Int23
2008-07-21 14:03
2008.08.24
Как в существующую книгу Эксела добавить макрос и вызвать его


15-1215433698
DRG
2008-07-07 16:28
2008.08.24
C# или С++ с чего начать?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский