Announcement

Collapse
No announcement yet.

nicht alle Codepfade geben einen Wert zurück

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • nicht alle Codepfade geben einen Wert zurück

    Hallo zusammen!

    Hab wiedermal ne Frage. Ich hab mir das Tool WMI Creator installiert, nicht schlecht eigentlich.
    Ich hab mir da ein Code erzeugen lasse, und in eine vorhandene Klasse eingefügt. Jetzt sagt mir aber der Compiler, dass nicht alle Codepfade einen Wert zurück geben. Da weiß ich nicht mehr weiter und hoffe hier auf Hilfe.
    Hier der Code:

    public static string CPUTyp()
    {
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
    foreach (ManagementObject queryObj in searcher.Get())
    {
    return queryObj["Caption"].ToString();

    }

    }

  • #2
    Hi,

    ändere zu
    Code:
    public static string CPUTyp()
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
    string name = "";
    foreach (ManagementObject queryObj in searcher.Get())
    {
    name = queryObj["Caption"].ToString();
    
    }
    return name;
    
    }
    Habs nicht getestet, sollte aber passen.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      gfoidl hat eine vernünftige Lösung gebracht, aber es ist immer noch nicht sinnvoll, und es ist unklar, was Du eigentlich erreichen willst. In der foreach-Schleife wird bei jedem Eintrag etwas ausgewertet. Was soll denn zurückgegeben werden? der erste Eintrag, der letzte Eintrag, das häufigste Vorkommen?

      Die ursprüngliche Fehlermeldung bedeutet übrigens: Beim ersten Auftreten in der Schleife gibt es einen return-Wert; dadurch wird aber die Schleife sofort abgebrochen. Der Compiler erkennt nicht, dass die Schleife niemals bis zum Ende durchlaufen wird, und vermisst einen return-Wert am Ende der Schleife.

      Wenn Du nach einem ersten Auftreten die Schleife beenden willst, solltest Du sie per break auch wirklich abbrechen.

      Jürgen

      Comment


      • #4
        Originally posted by Jürgen Thomas View Post
        gfoidl hat eine vernünftige Lösung gebracht, aber es ist immer noch nicht sinnvoll, und es ist unklar, was Du eigentlich erreichen willst. In der foreach-Schleife wird bei jedem Eintrag etwas ausgewertet. Was soll denn zurückgegeben werden? der erste Eintrag, der letzte Eintrag, das häufigste Vorkommen?

        Die ursprüngliche Fehlermeldung bedeutet übrigens: Beim ersten Auftreten in der Schleife gibt es einen return-Wert; dadurch wird aber die Schleife sofort abgebrochen. Der Compiler erkennt nicht, dass die Schleife niemals bis zum Ende durchlaufen wird, und vermisst einen return-Wert am Ende der Schleife.

        Wenn Du nach einem ersten Auftreten die Schleife beenden willst, solltest Du sie per break auch wirklich abbrechen.

        Jürgen
        Das Problem liegt nicht darin, wenn das Innere der Schleife ausgeführt wird, sondern wenn das Innere eben nicht ausgeführt wird, weil kein passendes Objekt im Container ist - dann fehlt der Rückgabewert. Nichtsdestotrotz hat Jürgen recht - der Ansatz von gfoidl lässt sich sicherlich kompilieren, gibt aber entweder einen leeren string oder den letzten string zurück (während der nachfolgende String immer seinen Vorgänger "überschreibt").

        Viele Grüße
        HP

        Comment


        • #5
          Also um es genau zu sagen soll die Methode den Typ des Prozessors ausgeben. Mit Console.WriteLine(queryObj["Caption"].ToString()); geht das auch, ich will aber den Text in einer Testbox ausgeben. Diese Aufgabe wird aber im Button_Click Ereignis ausgeführt. In der o.g. Methode will ich ich den String bereitstellen, den ich dann aus der MainMethode aufrufe.

          Genau ich frag mich auch schon warum dazu eine Schleife durchlaufen wird?!
          Aber es gibt auch auf .net Snipplets mehrere Schnipsel die auf WMI Informationen in einer foreach Schleife zugreifen obwohl nur ein wert zurückgegeben wird..

          Ich habs geschafft, ich hab das ganze in einen try-catch Block eingeschlossen, und dann nach der foreach schleife eine Managment.Exception abgefangen. Das ganze hab ich dann nochmal am Ende nochmal außerhalb des catch blocks eingefüht (throw new Managment Esception) und da gings. Ich hab das aus einer Methode entnomme, die den Namen der Domäne ausgibt, da wird das genauso gemacht. der Code sieht jetzt so aus:
          public static string CpuTyp()
          {

          try
          {
          ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_Processor");
          foreach (ManagementObject queryObj in searcher.Get())
          {
          return queryObj["Caption"].ToString();

          }
          }
          catch (Exception e)
          {

          throw new ManagementException("Error retrieving workgroup name.", e);
          }

          throw new ManagementException("Error retrieving workgroup name.");
          }


          Danke trotzdem für die Hilfe!
          Zuletzt editiert von brown78; 11.09.2008, 19:54.

          Comment


          • #6
            Hi brown78,

            Originally posted by brown78 View Post
            > Genau ich frag mich auch schon warum dazu eine Schleife durchlaufen wird?!
            > Aber es gibt auch auf .net Snipplets mehrere Schnipsel die auf WMI Informationen in einer foreach Schleife zugreifen obwohl nur ein wert zurückgegeben wird..
            Ich kenne mich mit WMI nicht aus, aber vermutlich gibt Dir der Schnipsel pro Prozessor einen Eintrag zurück.

            Du solltest Dir die Beiträge meiner Vorredner nochmals genauer anschauen, es reicht im Normalfall nicht, dass der Code irgendwie läuft, sondern er sollte auch auf anderen Systemen richtig laufen, als Deinem Entwickler-PC.
            Deshalb rate ich Dir, den "return"-Befehl und seine Auswirkungen nochmals genauer unter die Lupe zu nehmen.

            Anmerkung:
            Versteh' das nicht bitte als Lehrmeisterei, sondern als konstruktiven Ratschlag.

            HTH,
            Karsten

            Comment


            • #7
              Ja nee das ist schon ok, ich will ja lernen!!! Ich hab nämlich schon Probleme, das Programm im Debug oder Release Modus AnyCPU zu debuggen, es läft nur im Modus x86 oder x64.
              Bei AnyCPU bekomme ich eine Meldung über eine nicht behandelte ArgumentNullEsception.

              Die Konstruktuion wie oben beschreiben mit dem try catch Block muß so korrekt sein, denn sie wird so vom WMI Creator vorgegeben... Hoff ich mal.

              Comment

              Working...
              X