Ошибка исключения при попытке выполнить пинг с помощью таймера

#vb.net #timer

#vb.net #таймер

Вопрос:

Я получаю эту ошибку, которую, похоже, не могу решить с помощью try … catch, и мне нужен ваш совет о том, как это решить. Есть еще код, но я считаю, что это связано с ошибкой, которую я получаю. Код такой:

 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim ip As String
    Dim sw As New Stopwatch
    ip = "some.ip.com"
    Try
        If My.Computer.Network.Ping(ip) Then
            ping = (sw.ElapsedMilliseconds)
            Label1.Text = ping amp; "ms"
            sw.Stop()
            MsgBox("You have no connection.")
        End If
    Catch ex As Exception
        MsgBox(ex)
    End Try
    If ping < 200 Then
        Label2.BackColor = Color.Green
        Label2.Text = "Good Connection"
    ElseIf ping > 200 Then
        Label2.BackColor = Color.Orange
        Label2.Text = "Medium connection"
    ElseIf ping > 400 Then
        Label2.BackColor = Color.Red
        Label2.Text = "Bad Connection"
    ElseIf ping <= 0 Then
        Label2.Text = "No Connection"
        Label2.BackColor = Color.Brown
    End If
  

Ошибка выдает ошибку исключения:

 ************** Exception Text **************
System.Net.NetworkInformation.PingException: An exception occurred during a Ping request. ---> System.Net.Sockets.SocketException: The requested name is valid, but no data of the requested type was found
  at System.Net.Dns.GetAddrInfo(String name)
  at System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6)
  at System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
  at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 timeout,     Byte[] buffer, PingOptions options)
  

— Завершение трассировки внутреннего стека исключений —
в System.Net.NetworkInformation.Ping.Send(строка hostNameOrAddress, тайм-аут Int32, буфер Byte[], параметры PingOptions)
в System.Net.NetworkInformation.Ping.Send(строка hostNameOrAddress, тайм-аут Int32, буфер байт[])
в Microsoft.VisualBasic.Devices.Сеть.Пинг (строка hostNameOrAddress, тайм-аут Int32)
в Microsoft.VisualBasic.Devices.Сеть.Ping(строка hostNameOrAddress)
в Sky_Casino.Form2.timer1_Tick(отправитель объекта, EventArgs e) в C:Userstonakis2108DocumentsVisual Studio 2013Projects somethingsomethingForm2.vb: строка 61
в системе.Windows.Формы.Таймер.OnTick (EventArgs e)
в системе.Windows.Формы.Таймер.TimerNativeWindow.WndProc(Messageamp; m)
в системе.Windows.Формы.NativeWindow.Обратный вызов (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Я хочу, чтобы мой код выполнял пинг цели, возвращал пинг в ms через sw и делал это каждые 5 секунд.

Я получаю эту ошибку, когда отключаю соединение, чтобы проверить наличие ошибок, пока я подключен к программе. Кто-нибудь может помочь?

Комментарии:

1. Он не знает, что это за машина «some.ip.com «. Я тоже этого не делаю. Когда вы отсоедините кабель, вы, конечно, также потеряете соединение с DNS-сервером и возможность разрешения «some.ip.com » на IP-адрес.

2. Почему вы не можете «решить с помощью try … catch»? Вероятно, вы не хотите показывать окно сообщения при возникновении исключения, но предположительно исключение перехватывается? Можете ли вы просто установить ping = -1 блок catch?

3. @Mark что вы имеете в виду? Я хочу показать пинг пользователям в ms. Я хотел сказать, что try … catch не работает, потому что, похоже, я все еще получаю исключение по таймеру.

4. @Tonakis2108 исключение все равно будет возникать, и вы по-прежнему будете отображать сообщение об ошибке, но в этом суть Try / Catch — вы можете решить, как с этим справиться. Я добавлю ответ с «рабочим» кодом.

Ответ №1:

Смысл попытки / перехвата в том, что исключение все равно будет возникать, но вы можете обработать его по своему усмотрению, вместо сбоя программы. Следующий код будет обрабатывать ошибки более корректно, и я также изменил ваши проверки на время пинга, поскольку ваша комбинация проверок меньше и больше не даст вам того, что вы хотите, и добавил более длительный тайм-аут (по умолчанию 500 мс). Все еще не лучший код, но для меня он обрабатывает отключенную сеть!

 Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Dim ip = "www.google.com"
    Dim timeout = 1000
    Dim sw = New Stopwatch()
    Try
        Dim ping As Long = -1
        sw.Start()
        If My.Computer.Network.Ping(ip, timeout) Then
            sw.Stop()
            ping = sw.ElapsedMilliseconds
            Label1.Text = String.Format("{0}ms", ping)
        End If
        If ping < 0 Then
            Label2.Text = "Ping Timed Out"
            Label2.BackColor = Color.Brown
        ElseIf ping < 200 Then
            Label2.Text = "Good Connection"
            Label2.BackColor = Color.Green
        ElseIf ping < 400 Then
            Label2.Text = "Medium Connection"
            Label2.BackColor = Color.Orange
        Else
            Label2.Text = "Bad Connection"
            Label2.BackColor = Color.Red
        End If
    Catch ex As Exception
        Label1.Text = ""
        Label2.Text = ex.Message
        Label2.BackColor = Color.Red
        Console.WriteLine(ex.ToString())
    End Try
End Sub
  

Комментарии:

1. Даже если это работает таким образом, я нашел ответ на свои проблемы, наблюдая за местоположением, в котором моя студия создавала мое приложение. Хотя код работает отлично, и я действительно хочу поблагодарить вас за помощь в моей просьбе, даже если это было что-то, что я мог вызвать по ошибке. Еще раз спасибо и извините за беспокойство. (Жаль, что я не могу 1 ответ). : (