捕获SocketException

时间:2018-02-17 14:29:35

标签: vb.net sockets error-handling

我可能会以错误的方式解决这个问题,因为我没有网络请求的经验,所以请耐心等待。

我正在尝试执行以下代码:

webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))

当URI可用时,这可以正常工作。但是,如果它不可用(即,如果相应的服务未运行且未公开相关数据),则会收到以下错误消息:

  

发生SocketException:无法建立连接,因为目标计算机主动拒绝它。

所以,我尝试按如下方式实现try / catch块:

If Not webClient.IsBusy Then
    Try
        webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
    Catch ex As Sockets.SocketException
        MsgBox("Error. Service is not running. No data can be extracted.")
    End Try
End If

那不起作用。 VB.Net仍然不显示消息框。所以,我尝试了其他的东西:

If Not webClient.IsBusy Then
    Dim req As System.Net.WebRequest
    req = System.Net.WebRequest.Create(New Uri("http://localhost:8115/"))
    Dim resp As System.Net.WebResponse
    Dim ready As Boolean = False

    Try
        resp = req.GetResponse
        resp.Close()
        ready = True
    Catch ex As Sockets.SocketException
        MsgBox("Error. Service is not running. No data can be extracted.")
    End Try

    If ready Then
        webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
        ready = False
    End If
End If

它也不起作用。我必须错误地解​​决这个问题。有人能告诉我这样做的正确方法是什么?在运行DownloadStringAsync函数之前,有没有办法首先检查数据是否存在?

谢谢!

编辑:要根据Visual Vincent的回答为讨论添加上下文,这是我的代码的样子。只是一个表格。

Imports System.Net

Public Class Form1
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim webClient As New System.Net.WebClient
        Try
            WebClient.DownloadStringAsync(New Uri("http://localhost:8115"))
        Catch ex As System.Net.Sockets.SocketException
            MessageBox.Show("Error")
        Catch ex As System.Net.WebException
            MessageBox.Show("Error. Service is not running. No data can be extracted.")
        Catch ex As Exception
            MessageBox.Show("An error occurred:" & Environment.NewLine & ex.Message)
        End Try
    End Sub
End Class

1 个答案:

答案 0 :(得分:2)

WebClient.DownloadStringAsync()方法不会抛出SocketException,而是抛出WebException(可能将其内部异常设置为SocketException)。

来自the documentation

  

例外

     

<强>引发WebException

     

组合BaseAddress和地址形成的URI无效。

     

-OR -

     

下载资源时出错。

SocketException大部分时间仅由原始套接字抛出。然后System.Net命名空间的成员通常将它们包装在WebException

所以要修复你的代码:

Try
    webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
Catch ex As System.Net.WebException
    MessageBox.Show("Error. Service is not running. No data can be extracted.")
End Try

注意:我改为MessageBox.Show(),因为MsgBox()已过时,只有与VB6向后兼容才存在。

但是,最佳做法是添加另一个Catch语句,以捕获所有其他异常,这样就不会让应用程序处于崩溃状态。

您还应该记录来自WebException的错误消息,因为可能由于其他原因而不仅仅是端点不可用而抛出错误消息。

Try
    webClient.DownloadStringAsync(New Uri("http://localhost:8115/"))
Catch ex As System.Net.WebException
    MessageBox.Show("Error. Service is not running. No data can be extracted.")
Catch ex As Exception
    MessageBox.Show("An error occurred:" & Environment.NewLine & ex.Message)
End Try