18

I am trying to handle two different WebException's properly.

Basically they are handled after calling WebClient.DownloadFile(string address, string fileName)

AFAIK, so far there are two I have to handle, both WebException's:

  • The remote name could not be resolved (i.e. No network connectivity to access server to download file)
  • (404) File not nound (i.e. the file doesn't exist on the server)

There may be more but this is what I've found most important so far.

So how should I handle this properly, as they are both WebException's but I want to handle each case above differently.

This is what I have so far:

try
{
    using (var client = new WebClient())
    {
        client.DownloadFile("...");
    }
}
catch(InvalidOperationException ioEx)
{
    if (ioEx is WebException)
    {
        if (ioEx.Message.Contains("404")
        {
            //handle 404
        }
        if (ioEx.Message.Contains("remote name could not")
        {
            //handle file doesn't exist
        }
    }
}

As you can see I am checking the message to see what type of WebException it is. I would assume there is a better or a more precise way to do this?

bad_coder
  • 11,289
  • 20
  • 44
  • 72
baron
  • 11,011
  • 20
  • 54
  • 88
  • Guessing the answer is along the lines of checking the exception status, as in using web exception instead, `(if wEx.Status == WebExceptionStatus.Something) { //handle } (if wEx.Status == WebExceptionStatus.SomethingElse) { //handle that }` – baron Apr 16 '10 at 05:20

1 Answers1

29

Based on this MSDN article, you could do something along the following lines:

try
{
    // try to download file here
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)
        {
            // handle the 404 here
        }
    }
    else if (ex.Status == WebExceptionStatus.NameResolutionFailure)
    {
        // handle name resolution failure
    }
}

I'm not certain that WebExceptionStatus.NameResolutionFailure is the error you are seeing, but you can examine the exception that is thrown and determine what the WebExceptionStatus for that error is.

Zach Johnson
  • 23,678
  • 6
  • 69
  • 86
  • I also looked here: http://msdn.microsoft.com/en-us/library/system.net.webexceptionstatus.aspx which shows you all possible status'. You are correct with those two status' those are the ones I got in each situation. I have decided to treat the 404 seperately and then else for any other exception status - as the others all seem to do with the connection and network connectivity which I will group together. – baron Apr 16 '10 at 05:51