![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
обработка ошибок записи 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 чем именно?