Why does a method that calls Ping.Send() on an invalid URL die with an unhandled exception?

时间:2015-12-14 17:56:46

标签: c#

The following method calls Ping.Send(). When I pass an invalid URL, Send() dies and an unhandled exception happens. What is the cause of this?

private void ping()
{
         comboBox3.Visible = false;
         listBox2.Items.Clear();

         // check the url if it is null
         if (string.IsNullOrEmpty(textBox1.Text) || textBox1.Text == "")
         {
             listBox2.Items.Add("Please use valid IP or web address!!");
             comboBox3.Visible = false;
             coloring_red_tab4();
         }
         else
         {
             // do the ping 
             coloring_green_tab4();

             for (int i = 0; i < numericUpDown1.Value; i++)
             {
                 string s;
                 s = textBox1.Text;
                 string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
                 byte[] buffer = Encoding.ASCII.GetBytes(data);
                 int timeout = 120;
                 Ping p = new Ping();
                 PingOptions options = new PingOptions();
                 options.DontFragment = true;
                 //pingexception  was unhalded (if the url wrong here is the error)
                 PingReply r = p.Send(s, timeout, buffer, options);

                 // if it's true url
                 if (r.Status == IPStatus.Success)
                 {
                     listBox2.Items.Add("Ping to " + s.ToString() + "[" + r.Address.ToString() + "]" + " (Successful) "
                       + "Bytes =" + r.Buffer.Length + " TTL=" + r.Options.Ttl + " Response delay = " + r.RoundtripTime.ToString() + " ms " + "\n");
                     label91.Text = r.Address.ToString();
                 }
                 else
                 {
                    // just to know the ip for the website if they block the icmp protocol
                     listBox2.Items.Add(r.Status);
                     IPAddress[] ips;
                     ips = Dns.GetHostAddresses(textBox1.Text);

                     foreach (IPAddress ip in ips)
                     {
                         label91.Text = ip.ToString();
                     }
                 }
             }
         }
     }

1 个答案:

答案 0 :(得分:3)

异常未处理,因为您没有处理它。无论何时调用.Net库方法,都需要检查其文档以查看它抛出的异常,并确定要在该级别的代码中处理哪些(如果有)。以下是Ping.Send()文档的相关部分,我将其作为图像包含在内,以便您能够识别这些部分:

enter image description here

请注意,文档说明如果

可能会发生PingException
  

发送或接收ICMP消息时抛出异常。查看引发的确切异常的内部异常。

因此,从文档中可以清楚地看出,来自Ping()的许多错误将被报告为抛出异常,而不是通过设置PingReply.Status != IPStatus.Success来报告。因此,您需要将代码修改为以下内容:

    public static bool TryPing(string hostNameOrAddress, out string pingStatusMessage, out string pingAddressMessage)
    {
        if (String.IsNullOrWhiteSpace(hostNameOrAddress))
        {
            pingStatusMessage = "Missing host name";
            pingAddressMessage = "";
            return false;
        }

        var data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        var buffer = Encoding.ASCII.GetBytes(data);
        var timeout = 120;
        using (var p = new Ping())
        {
            var options = new PingOptions();
            options.DontFragment = true;
            try
            {
                var r = p.Send(hostNameOrAddress, timeout, buffer, options);
                if (r.Status == IPStatus.Success)
                {
                    pingStatusMessage = "Ping to " + hostNameOrAddress.ToString() + "[" + r.Address.ToString() + "]" + " (Successful) "
                      + "Bytes =" + r.Buffer.Length + " TTL=" + r.Options.Ttl + " Response delay = " + r.RoundtripTime.ToString() + " ms " + "\n";
                    pingAddressMessage = r.Address.ToString();
                    return true;
                }
                else
                {
                    // just to know the ip for the website if they block the icmp protocol
                    pingStatusMessage = r.Status.ToString();
                    var ips = Dns.GetHostAddresses(hostNameOrAddress);

                    pingAddressMessage = String.Join(",", ips.Select(ip => ip.ToString()));
                    return false;
                }
            }
            catch (PingException ex)
            {
                pingStatusMessage = string.Format("Error pinging {0}: {1}", hostNameOrAddress, (ex.InnerException ?? ex).Message);
                pingAddressMessage = hostNameOrAddress;
                return false;
            }
        }
    }

在这里,我从用户界面代码中提取了一个实用程序方法,并在不再需要Ping实例后正确处理它。

然后

TryPing(@"www.google.com", out pingStatusMessage, out pingAddressMessage);

给予

Ping to www.google.com[146.115.8.83] (Successful) Bytes =32 TTL=62 Response delay = 8 ms

虽然

TryPing(@"www.kdjf98rglkfgjldkfjgdl;fge8org.com", out pingStatusMessage, out pingAddressMessage);

给出

Error pinging www.kdjf98rglkfgjldkfjgdl;fge8org.com: No such host is known
相关问题