WebException - 阻止每个循环

时间:2017-09-30 21:39:31

标签: .net vb.net for-loop system.net.webexception

我几个月后开始学习编码。 今天我想编写密码管理器代码。一切正常,但如果主机无法访问,则获取图标功能会出现问题。此功能用于从网页获取favicon。

           Try

            For Each myItem As ListViewItem In lv_data.Items

                Dim baseurl = myItem.Text
                Dim url As Uri = New Uri(baseurl)

                If url.HostNameType = UriHostNameType.Dns Then
                    Dim iconURL = "http://" & url.Host & "/favicon.ico"

                    Dim request As System.Net.WebRequest = System.Net.HttpWebRequest.Create(iconURL)
                    Dim response As System.Net.HttpWebResponse = request.GetResponse()
                    Dim stream As System.IO.Stream = response.GetResponseStream()
                    imglist.Images.Add(Image.FromStream(stream))
                    lv_data.Items.Item(myItem.Index).ImageIndex = myItem.Index
                End If

            Next
        Catch ex As WebException

        End Try

某些服务器响应异常:

  

无法解析远程主机

。 当发生这种情况时,每个循环的整体停止。我正在寻找一种忽略该错误的方法,并继续列表视图中的下一项。

任何人都可以给我一个提示或者一个解决方案。

祝你好运, Der King

1 个答案:

答案 0 :(得分:0)

首先移动循环中的try catch

For Each myItem As ListViewItem In lv_data.Items
    Try

       Dim baseurl = myItem.Text
       Dim url As Uri = New Uri(baseurl)
       ...
    Catch
    End Try
Next

这将允许您的代码在检索favicon.ico时遇到异常时在foreach循环内继续

下一个问题是如何处理图像列表中的图像。当您遇到异常,因为您的代码无法检索图标时,您不会向ImageList添加任何内容 此时,您的ImageList和ListView.Items不包含相同数量的元素,因此您无法使用myItem.Index来引用ImageList中的图像。

但是,因为图像刚刚添加到上一行的ImageList中,所以您确定所需的图像是ImageList的最后一个元素。所以你可以使用ImageList.Images.Count属性(少于1)

imglist.Images.Add(Image.FromStream(stream))
myItem.ImageIndex = imgList.Images.Count - 1

(请注意,您可以在此上下文中直接使用myItem)