Entwickler-Ecke

C# - Die Sprache - PingExeptinon wurde nicht behandelt


sirampersand - Mi 25.11.09 21:32
Titel: PingExeptinon wurde nicht behandelt
Hi,
Ich bin zwar relativ neu in C# trotzdem bin ich total happy das ich in relativ kurzer Zeit ein Programm zusammenbasteln konnte das mir ein Array von hosts pingt. (string[] myArr)
Der einzige Vermutstropfen ist das wenn ein host nicht existiert oder nicht aufgelößt werden kann das Programm nicht kompiliert wird. Fehler: PingExeptinon wurde nicht behandelt!
In dieser Zeile ist die Krux:

C#-Quelltext
1:
PingReply xreply = myPing.Send(tempElement, timeout, buffer, pingOptions); //Senden der Anfrage                    

Scheinbar kommt NULL oder es stimmt was nicht mit den Typen

ich habe zwar versucht alle möglichkeiten abzufangen aber scheinbar ist da was anderes faul. (siehe else Zweig)
hier der code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.NetworkInformation;

namespace PingApplikation
{
    public class Circle
    {
        static void Main(string[] args)
        {
            Ping myPing = new Ping(); //Instanziieren
            //String host = "wsnx001"; //oder "192.168.178.1"
            string[] myArr = { "wsnx001""wsnx002"};

            byte[] buffer = new byte[32]; //der Buffer
            int timeout = 1000//Timeout in MilliSekudnen
            PingOptions pingOptions = new PingOptions(); //Optionen können festgelegt werden

            foreach (string tempElement in myArr)
            {
                Console.WriteLine(tempElement);
                PingReply xreply = myPing.Send(tempElement, timeout, buffer, pingOptions); //Senden der Anfrage
            
                            //Statusüberprüfung
                            Console.WriteLine(xreply.Status);

                            if (xreply.Status == IPStatus.Success)
                            {
                                Console.WriteLine("Antwort in {0}ms erhalten", xreply.RoundtripTime);
                            }
                            else if (xreply.Status == IPStatus.TimedOut)
                            // else if (xreply.Status == 11010) NO !
                            {
                                Console.WriteLine("-Timeout-");
                            }
                            else if (xreply.Status == IPStatus.Unknown || xreply.Status == IPStatus.DestinationNetworkUnreachable ||
                                        xreply.Status == IPStatus.DestinationHostUnreachable || xreply.Status == IPStatus.DestinationProhibited  ||
                                            xreply.Status == IPStatus.DestinationProtocolUnreachable || xreply.Status == IPStatus.DestinationPortUnreachable  ||
                                                xreply.Status == IPStatus.NoResources || xreply.Status == IPStatus.BadOption  ||
                                                     xreply.Status == IPStatus.HardwareError || xreply.Status == IPStatus.PacketTooBig  ||
                                                         xreply.Status == IPStatus.BadRoute || xreply.Status == IPStatus.TtlExpired  ||
                                                            xreply.Status == IPStatus.TtlExpired || xreply.Status == IPStatus.ParameterProblem  ||
                                                                xreply.Status == IPStatus.SourceQuench || xreply.Status == IPStatus.BadDestination  ||
                                                                    xreply.Status == IPStatus.DestinationUnreachable || xreply.Status == IPStatus.TimeExceeded  ||
                                                                        xreply.Status == IPStatus.BadHeader || xreply.Status == IPStatus.UnrecognizedNextHeader  ||
                                                                            xreply.Status == IPStatus.IcmpError || xreply.Status == IPStatus.DestinationScopeMismatch
                                                                            )
                            /* */
                            {
                                Console.WriteLine("sukki");
                            }
                            else
                            {
                                Console.WriteLine("eeee");
                            }
                            // Console.WriteLine(tempElement);

            }

            /*        PingReply reply = myPing.Send(host, timeout, buffer, pingOptions); //Senden der Anfrage
                     //Statusüberprüfung
                     if (reply.Status == IPStatus.Success)
                     {
                         Console.WriteLine("Antwort in {0}ms erhalten", reply.RoundtripTime);
                     }
                     else if (reply.Status == IPStatus.TimedOut)
                     {
                         Console.WriteLine("Timeout");
                     }
                   */

            Console.ReadKey();
        }
    }
}

Kann mir wer weiterhelfen in Theorie und Praxis?
Danke für Eure Hilfe !
Ampersand

Moderiert von user profile iconNarses: C#-Tags hinzugefügt


danielf - Do 26.11.09 09:36

Hallo und :welcome:,

du bekommst wahrscheinlich den Fehler nicht, wenn du kompilierst, sondern zur Laufzeit.

.NET und andere OO Programmiersprachen verwenden für die Fehlerbehandlungen sogenannte Ausnahmebehandlungen/Exceptions (http://openbook.galileocomputing.de/csharp/kap04.htm).

Sprich bei den Status-Informationen ging vom Protokoll her alles in Ordnung und du bekommst einen definierten StatusCode zurück. Tritt allerdings etwas "unkonformes" auf, dann wird eine Exception geschmissen.

Welche das genau sind, kannst du im .NET Framework auf der MSDN-Seite nachschauen (http://msdn.microsoft.com/de-de/library/7hzczzed(VS.80).aspx).

Im oberen Link ist ja auch beschreiben, wie du auf einen solchen Fehler reagieren kannst. Sollte es nicht helfen, schreib bitte nochmal.

Gruß Daniel


sirampersand - Do 26.11.09 18:38

Hallo Danielf,

Vielen Dank für die einfache aber kompetente Hilfe und die Links. Der erste hat ganz toll geholfen, schnell mal try und catch eingebaut

C#-Quelltext
1:
2:
3:
4:
catch (Exception e)
   {
       Console.WriteLine("Exception " + e.Message);
   }

und schon lief das Programm (der Debugger) durch :-)
Die (zu erwartende) Fehlermeldung wurde auch ausgebeben:
"Exception Während einer Pinganforderung ist eine Ausnahme aufgetreten."

...Hinzufügen in den catch block von...

C#-Quelltext
1:
       Console.WriteLine("Exception {0}", e);                    

... ergab tiefere Einblicke, die aufschluss gaben warum meine elesif Orgie überflüssig war ....
(der Fehler kommt aus einer ganz anderen Klasse oder so....)


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Exception System.Net.NetworkInformation.PingException: Während einer Pinganforde
rung ist eine Ausnahme aufgetreten. ---> System.Net.Sockets.SocketException: Der
 angegebene Host ist unbekannt
   bei System.Net.Dns.GetAddrInfo(String name)
   bei System.Net.Dns.InternalGetHostByName(String hostName, Boolean includeIPv6
)
   bei System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
   bei System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 t
imeout, Byte[] buffer, PingOptions options)
   --- Ende der internen Ausnahmestapelüberwachung ---
   bei System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 t
imeout, Byte[] buffer, PingOptions options)
   bei PingApplikation.Circle.Main(String[] args) in F:\Visual Studio 2008\Proje
cts\NetPinger\NetPinger\Program.cs:Zeile 38.

Die Zweiter link hat mir nicht so viel beigebracht, ich hab dann ein wenig gesucht und bin auf
http://msdn.microsoft.com/de-de/library/system.net.sockets.socketexception(VS.80).aspx
gestoßen, tiefer konnte ich aber nicht mehr weil mir dazu noch der Horizont fehlt, macht aber nix, bin ja erst kurz dabei!!!

Nochmals recht herzlichen Dank,
C# macht spass ;-) :D
Gruß Ampersand