I wasn't suggesting that you add a Try...Catch block to your DownloadFileCompleted event handler. The exception handler is built into WebClient class. The WebClient tries to download the file and, if an exception is thrown, it catches it. Once the download is complete, either successfully or unsuccessfully, the DownloadFileCompleted event is raised. In the event handler, you check whether an exception occurred or not and you proceed accordingly, e.g.
vb.net Code:
  1. Imports System.Net
  2. Imports System.ComponentModel
  3.  
  4. Public Class Form1
  5.  
  6.     Private WithEvents downloader As New WebClient
  7.  
  8.     Private Sub downloadButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles downloadButton.Click
  9.         If Not Me.downloader.IsBusy Then
  10.             MessageBox.Show("A download is already in progress.",
  11.                             "Download In Progress",
  12.                             MessageBoxButtons.OK,
  13.                             MessageBoxIcon.Error)
  14.         Else
  15.             Try
  16.                 Me.downloadButton.Enabled = False
  17.  
  18.                 Dim remoteAddress As String = Me.remoteAddressTextBox.Text
  19.                 Dim localAddress As String = Me.localAddressTextBox.Text
  20.                 Dim userToken As String() = New String() {remoteAddress, localAddress}
  21.  
  22.                 Me.downloader.DownloadFileAsync(New Uri(remoteAddress), localAddress, userToken)
  23.             Catch ex As Exception
  24.                 Me.downloadButton.Enabled = True
  25.  
  26.                 MessageBox.Show(ex.Message, "Download Failed", MessageBoxButtons.OK, MessageBoxIcon.Error)
  27.             End Try
  28.         End If
  29.     End Sub
  30.  
  31.     Private Sub downloader_DownloadFileCompleted(ByVal sender As Object,
  32.                                                  ByVal e As AsyncCompletedEventArgs) Handles downloader.DownloadFileCompleted
  33.         Me.downloadButton.Enabled = True
  34.  
  35.         If e.Error Is Nothing Then
  36.             Dim addresses As String() = DirectCast(e.UserState, String())
  37.  
  38.             MessageBox.Show(String.Format("The file '{0}' was successfully downloaded to '{1}'.",
  39.                                           addresses(0),
  40.                                           addresses(1)),
  41.                             "Download Complete",
  42.                             MessageBoxButtons.OK,
  43.                             MessageBoxIcon.Error)
  44.         Else
  45.             MessageBox.Show(e.Error.Message, "Download Failed", MessageBoxButtons.OK, MessageBoxIcon.Error)
  46.         End If
  47.     End Sub
  48.  
  49. End Class
With regards to the NetworkAvailabilityChanged event, there may not be any reason to handle it as the DownloadFileCompleted event will still provide exception details, so you may end up double-reporting to the user. If you do still want to handle it, you can check the IsBusy property of your WebClient to determine whether a file is being downloaded.