C# Probleme mit Errorhandling

estre

Commander
Registriert
Dez. 2005
Beiträge
3.006
Hi zusammen,

ich brauche mal wieder etwas Hilfe für mein C#-Programm.

Und zwar habe ich folgende Schleife:

Code:
for (int i = 0; i > 5; i++)
{
	try
{
	Mache irgendetwas
}
Catch
{
	Setze die Schleife fort
}

Weiterer Code, der im Catch-Falle nicht mehr ausgeführt werden soll.
}


Wenn der Code in meinem Try-Block einen Fehler verursacht möchte ich also, dass die Schleife einfach mit dem nächsten Durchlauf
Fortgesetzt wird.

Wie setzt man das am besten um? Ich habe schon „return“ und „break“ probiert, allerdings klappt das nicht, weil „return“ die gesamte aufrufende Methode beendet und „break“ die komplette Schleife beendet :) .... Mit "goto" könnte man das lösen oder?! Das soll ja aber nicht die smarteste Lösung sein ^^


Danke für Eure Hilfe!

Grüße
 
Code:
continue;

ist das was du suchst
der befehlt leitet zum nächsten schritt in der schleife weiter.
 
Hi,

den kompletten try/catch innerhalb der for Schleife :=)

Edit: hab mich bei den Klammern verzählt, ja continue ist der richtige Befehl.

Gruß,
d2boxSteve

PS:
try
{
mach
}
catch
{
bei Fehler hier
}
finally
{
das hier egal ob fehler oder nicht
}
 
Zuletzt bearbeitet:
riddickx schrieb:
Code:
continue;

ist das was du suchst
der befehlt leitet zum nächsten schritt in der schleife weiter.

perfekt, genau das was ich gesucht habe!

Vielen dank!
 
Kleiner Hinweis noch, gewöhn dir nicht an, so komplexe und lange Funktionen zu schreiben.
Üblicherweise sollten Methoden kurz und übersichtlich sein, also nicht länger als 5 Zeilen maximal 8 (Klammern nicht mitgezählt).

Der Inhalt vom Try-Catch-Block lässt sich zum Beispiel super in eine eigene Methode rausziehen. Auch die For-Schleife kann in eine eigene Methode, denn davor und danach wird ja auch noch Code kommen...

Macht das Lesen und Verstehen von Code um einiges einfacher und hilft auch bei der Fehlersuche.
Gute beschreibende Methoden-Namen vorausgesetzt, erübrigt sich so sogar jegliches Kommentieren...

Gruß und viel Spaß noch beim Programmieren ;-)
 
@ Erdmännchen

Da hast du vollkommen Recht. Mein Code ist mittlerweile auch schon ziemlich lang und ich versuche hier und da Dinge auszulagern, aber da fehlt es mir noch an Erfahrung, als dass ich zu 100% „cleanen“ Code habe ^^

Bei der Gelegenheit noch eine andere Frage:
Ich bin beim debuggen auf eine StackOverflowException in meiner Klasse gestoßen:

Code:
public class ComAnwendungsBuilder
    {
        private List<string> KomponentenGUIDListe = new List<string>();
    

        public List<String> KompGUIDListe
        {
            get
            {
                return KomponentenGUIDListe;
            }
            set
            {
                KompGUIDListe = KomponentenGUIDListe;
                    
            }

        }
    }

Ich möchte einfach eine Liste (KomponentenGUID) als Klasseneingeschaft deklarieren und mit get/set darauf zugreifen.

Die Exception tritt dann im set-Block auf:
Code:
set
            {
                KompGUIDListe = KomponentenGUIDListe;
                    
            }
Funktionieren diese „property“-getter und –setter bei Listen so überhaupt, oder habe ich etwas falsch gemacht ?!

Nochmals vielen Dank für Eure Hilfe!

Grüße
 
Du bist in einer Endlosschliefe, weil du im Setter nochmal den Setter der selben Property aufrufst anstatt den Wert der lokalen Variablen zuzuweisen.
Tipp: Mache dir selbst kenntlich, was eine Property (name beginnt mit Großbuchstaben) und was eine lokale Variable ist (Name beginnt mit Unterstrich und/oder Kleinbuchstaben).

Code:
public class ComAnwendungsBuilder
   {
    private List<string> _komponentenGUIDListe = new List<string>();
     
    public List<String> KomponentenGUIDListe 
    {
		get
		{
			return _komponentenGUIDListe;
		}
		set
		{
			_komponentenGUIDListe = value;
		}
    }
}
 
Moin,

ExceptionHandling sollte keine schlechte Programmierung abfangen. D.h. Du solltest Dir eine andere Überprüfung schaffen. Jedes ExceptionHandling frisst Resourcen und sollte deshalb nur da eingesetzt werden, wo Du keinen Einfluss auf das Ergebnis hast. Bspw. Zugriff auf externe Datenhaltungssysteme (Datenbank, Web / WCF-Services)
 
Hey,

@Darlis
Vielen Dank, es hat funktioniert.

@lbm1305
Bin ich völlig bei dir, ich wusste halt nicht wie ich es anders lösen sollte.
Die Schleife durchläuft bestimmte Anwendungen und macht irgendetwas damit im Anweisungsblock.
Das Problem ist nun, dass während des Schleifendurchlaufes eine Anwendung durchaus beendet werden kann. Die Schleife weiß das ja nicht, deswegen erhalte ich dann immer eine „Objketverweis nicht gefunden“- Exception.

Wenn du mir sagst wie man das besser lösen kann, bin ich dir dankbar :)

Grüße
 
Hey,

So einfach ist es ja eben nicht, eine Schleife ist doch ein völlig undynamisches Konstrukt. Wenn ich z.B. irgendwelche Objekte in eine Liste einlese und diese Liste mit einer Schleife durchlaufe, dann hat jedes Objekt den Status den es beim einlesen in die Liste hatte.
Wenn das Objekt zwischenzeitlich gelöscht wurde bekommt das die Schleife nicht mit.
Die einzige Möglichkeit die ich sehe ist es jedes Objekt das an der Reihe ist am Anfang des Anweisungsblockes zu refreshen und wenn es „null“ ist einfach mit dem nächsten Element in der Schleife weiter zu machen.

Da ich allerdings keinen Weg gefunden habe wie ich mein Objekt erneuern kann mache ich es mit try und catch, das funktioniert auch einwandfrei :)

grüße
 
Genau, das mein ich ja, du prüfst direkt bevor du in der Schleife was mit dem Objekt machst, ob es null ist und wenn ja, kannst es ja sogar direkt aus der Liste nehmen...

Was sind denn das für Objekte und woher bekommst du die?
 
Code:
// Wobei object Deinen Anwendungen entsprechen würde. Kein Muss, da alles von object erbt.

var anwendungen = new List<object>();
for (int i = 0; i < anwendungen.Count(); i++)
{
     if (anwendungen[i] != null)
    {
        // DoSomething
    }
}

Eine foreach-Schleife würde beim Versuch, ein Element aus der Liste zu entfernen eine Exception werfen.

Eventuell schaust Du Dir mal das Observer-Pattern an. Dabei werden die registrierten Anwendungen überwacht.
 
Zurück
Oben