How to catch a FtpWebResponse exception in C#
Solution 1
As generic way to solve this, just assign null
to the response first and then check in the catch block if it is null
.
FtpWebResponse response = null;
try
{
...
}
catch (WebException webex)
{
if ((response != null) && (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)) {
//do something
}
}
However, in this specific case, you have all the properties you need on the WebException
instance (including the server response)!
Solution 2
The correct solution to the problem can be found in this question here:
How to check if file exists on FTP before FtpWebRequest
In short:
Your 'response' variable will always be null because of the error. You need to test the FtpWebResponse from 'webex.Response' (cast it) to get the StatusCode.
Solution 3
Well you could always assign a variable:
FtpWebRequest reqFTP = null;
FtpWebResponse response = null;
Comments
-
jaywon about 2 years
I am building an FTP utility class in C#. In the case that a
WebException
is thrown on a call toFtpWebRequest.GetResponse()
, in my case the exception is thrown for the requested file not existing on the remote server theFtpWebResponse
variable is out of scope.But even if I declare the variable outside the
try..catch
block I get a compile error saying "Use of unassigned local variable 'response'", but as far as I can tell there is no way to assign it until you assign the response via theFtpWebRequest.GetResponse()
method.Can someone please advise, or am I missing something obvious?
Thanks!
Here is my current method:
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 } }
-
jaywon over 14 yearsjeez, i didn't even try that. Thanks for both tips! I looked at the WebExceptionStatus and wasn't sure if there was a type defined specifically for 'file not found'. I will look into that more but the null should do it.
-
Marc about 14 yearsThis solves the unassigned local variable problem, but doesn't help catching the exception because 'response' will still be null when the error happens. Check this question for the correct solution: stackoverflow.com/questions/347897/…
-
Lucero about 14 yearsMarc, note that I was addressing both the problem in general as well as the specific case with the
WebException
- see the bottom paragraph (which is the same solution in short as the one provided in your link). -
Marc about 14 yearsUps you're right, sorry I must have missed that part. However when I see code then I prefer reading code and obviously the given code doesn't catch the exception. Maybe you should add a comment to the code itself.
-
Marc about 14 yearsYou're right, however the code in your answer is misleading as it doesn't help catching the file unavailable exception.