Como capturar uma exceção FtpWebResponse em C #
-
19-09-2019 - |
Pergunta
Estou construindo uma classe de utilitário FTP em C #. No caso em que um WebException
é jogado em uma chamada para FtpWebRequest.GetResponse()
, no meu caso a exceção é lançada para o arquivo solicitado não existir no servidor remoto a variável FtpWebResponse
está fora do escopo.
Mas mesmo se eu declarar a variável fora do bloco try..catch
eu recebo um erro de compilação dizendo "Uso de unassigned variável local 'resposta'", mas tanto quanto eu posso dizer que não há maneira de atribuí-la até que você atribua a resposta através do método FtpWebRequest.GetResponse()
.
Por favor alguém pode aconselhar, ou estou faltando algo óbvio?
Obrigado!
Aqui é o meu método atual:
private void Download(string ftpServer, string ftpPath, string ftpFileName, string localPath,
string localFileName, string ftpUserID, string ftpPassword)
{
FtpWebRequest reqFTP;
FtpWebResponse response;
try
{
reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://"
+ ftpServer + "/" + ftpPath + "/" + ftpFileName));
reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
reqFTP.UseBinary = true;
reqFTP.Credentials = new NetworkCredential(ftpUserID,
ftpPassword);
/* HERE IS WHERE THE EXCEPTION IS THROWN FOR FILE NOT AVAILABLE*/
response = (FtpWebResponse)reqFTP.GetResponse();
Stream ftpStream = response.GetResponseStream();
FileStream outputStream = new FileStream(localPath + "\\" +
localFileName, FileMode.Create);
long cl = response.ContentLength;
int bufferSize = 2048;
int readCount;
byte[] buffer = new byte[bufferSize];
readCount = ftpStream.Read(buffer, 0, bufferSize);
while (readCount > 0)
{
outputStream.Write(buffer, 0, readCount);
readCount = ftpStream.Read(buffer, 0, bufferSize);
}
ftpStream.Close();
outputStream.Close();
response.Close();
}
catch (WebException webex)
{
/*HERE THE response VARIABLE IS UNASSIGNED*/
if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable) {
//do something
}
}
Solução
Como forma genérica para resolver isso, basta null
atribuir à resposta em primeiro lugar e, em seguida, verifique no bloco catch se é null
.
FtpWebResponse response = null;
try
{
...
}
catch (WebException webex)
{
if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) {
//do something
}
}
No entanto, neste caso específico, você tem todas as propriedades que você precisa na instância WebException
(incluindo o servidor resposta )!
Outras dicas
A solução correta para o problema pode ser encontrada nesta questão aqui:
Como verificar se o arquivo existe no FTP antes FtpWebRequest
Em suma:
A variável 'resposta' será sempre nula por causa do erro. Você precisa testar o FtpWebResponse de 'webex.Response' (cast-lo) para obter o StatusCode.
Bem, você pode sempre atribuir uma variável:
FtpWebRequest reqFTP = null;
FtpWebResponse response = null;