Как поймать исключение FtpWebResponse в C # - PullRequest
4 голосов
/ 11 марта 2010

Я создаю служебный класс FTP в C #. В случае, когда WebException выбрасывается при вызове FtpWebRequest.GetResponse(), в моем случае выдается исключение для запрошенного файла, не существующего на удаленном сервере, переменная FtpWebResponse находится вне области видимости.

Но даже если я объявляю переменную вне блока try..catch, я получаю ошибку компиляции, говорящую "Использование неназначенной локальной переменной 'response'", но, насколько я могу судить, нет способа присвоить ее, пока вы не назначите ответ по методу 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
            }
        }

Ответы [ 3 ]

6 голосов
/ 11 марта 2010

Как общий способ решения этой проблемы, просто присвойте ответу null сначала, а затем проверьте в блоке catch, является ли он null.

    FtpWebResponse response = null;
    try
    {
...
    }
    catch (WebException webex)
    {
        if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) { 
            //do something
        }
    }

Однако в этом конкретном случае у вас есть все необходимые свойства для экземпляра WebException (включая ответ сервера )!

2 голосов
/ 21 апреля 2010

Правильное решение проблемы можно найти в этом вопросе здесь:
Как проверить, существует ли файл на FTP перед FtpWebRequest

Короче говоря:
Ваша переменная 'response' всегда будет нулевой из-за ошибки. Вам нужно протестировать FtpWebResponse из webex.Response (приведите его), чтобы получить StatusCode.

1 голос
/ 11 марта 2010

Ну, вы всегда можете назначить переменную:

FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
...