Как перехватить исключение FtpWebResponse в C#
-
19-09-2019 - |
Вопрос
Я создаю служебный класс FTP на C#.В случае, если WebException
выдается при вызове FtpWebRequest.GetResponse()
, в моем случае исключение выдается для запрошенного файла, не существующего на удаленном сервере FtpWebResponse
переменная выходит за рамки.
Но даже если я объявлю переменную вне try..catch
блок, я получаю ошибку компиляции с сообщением «Использование неназначенной локальной переменной «ответ»», но, насколько я могу судить, нет способа назначить ее, пока вы не назначите ответ через FtpWebRequest.GetResponse()
метод.
Может кто-нибудь посоветовать, или я упускаю что-то очевидное?
Спасибо!
Вот мой текущий метод:
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
}
}
Решение
В качестве общего способа решения этой проблемы просто назначьте null
сначала ответ, а затем проверьте блок catch, если он null
.
FtpWebResponse response = null;
try
{
...
}
catch (WebException webex)
{
if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) {
//do something
}
}
Однако в данном конкретном случае у вас есть все необходимые свойства на WebException
экземпляр (включая ответ сервера)!
Другие советы
Правильное решение проблемы можно найти в этом вопросе здесь:
Как проверить, существует ли файл на FTP перед FtpWebRequest
Суммируя:
Ваша переменная «ответ» всегда будет иметь значение null из-за ошибки.Вам необходимо протестировать FtpWebResponse из «webex.Response» (привести его), чтобы получить StatusCode.
Ну, вы всегда можете назначить переменную:
FtpWebRequest reqFTP = null;
FtpWebResponse response = null;