Форум: "Начинающим";
Текущий архив: 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.49 MB
Время: 0.037 c