Если вы хотите, чтобы ваша функция показывала сообщения пользователю и возвращала false при любом сбое, кодируйте ее следующим образом:
function Myfunction(sUrl, sFile: String) : Boolean;
var
GetData : TFileStream;
begin
Result := False;
try
//if the line below fails, I get an unhandled exception
GetData := TFileStream.Create(sFile, fmOpenWrite or fmCreate);
try
try
IdHTTP.Get(sUrl, GetData);
Result := (IdHTTP.ResponseCode = 200);
except
on E: Exception do begin
MessageBox(0, PChar(E.message), 'Niðurhala skrá', MB_ICONERROR or MB_OK);
end;
end;
finally
GetData.Free;
end;
except
// you can handle specific exceptions (like file creation errors) or any exception here
end;
end;
Внимание
ИМХО, этот дизайн смешивает бизнес-логику (такую как получение ресурса / файла из Интернета и сохранение его в файл) и логику пользовательского интерфейса (например, отображение сообщений пользователю в случае ошибок).
В целом, это лучший подход для отделения бизнеса от логики пользовательского интерфейса, поскольку ваш код можно использовать повторно.
Например, вы можете изменить коэффициент следующим образом:
function DownloadToAFile(const sUrl, sFile: string): boolean;
var
GetData : TFileStream;
begin
GetData := TFileStream.Create(sFile, fmOpenWrite or fmCreate);
try
IdHTTP.Get(sUrl, GetData);
Result := (IdHTTP.ResponseCode = 200);
finally
GetData.Free;
end;
end;
function UIDownloadToAFile(const sUrl, sFile: string): boolean;
begin
try
Result := DownloadToAFile(sURL, sFile);
except
on E: EIDException do //IndyError
MessageBox(0, PChar(E.message), 'Internet Error', MB_ICONERROR or MB_OK);
on E: EFileCreateError do //just can't remember the extact class name for this error
MessageBox(0, PChar(E.message), 'File create Error', MB_ICONERROR or MB_OK);
end;
end;
procedure SomeOtherCode:
begin
if UIDownloadToAFile('http://domain.com/file.html', 'c:\folder\file.html') then
ShowMessage('Got the file')
else
ShowMessage('Error !');
end;
Завтра, если вы пишете сервис или модуль DataSnap, вы можете свободно использовать DownloadToAFile или, возможно, написать новый ServiceDownloadToAFile, который по очереди записывает ошибки в журнал или события Windows, или, возможно, отправить электронное письмо уведомить об этом HostAdmin.