WebException - 阻塞每个循环

WebException - Blocking For Each Loop

几个月以来我一直在学习编码。 今天我想编写一个密码管理器。一切正常,但如果无法访问主机,获取图标功能就会出现问题。这个函数是从网页中获取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

一些服务器响应异常:

Remote host could not be resolved

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

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

此致, 国王

首先将 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)