Hallo Forum!
Ich habe leider wieder einmal ein Problem: Es geht dabei um meine Anwendung aus diesem Thread: "Verunreinigte Variablen" nach COMException
Über eine API baue ich eine Verbindung zu einem Server auf, hole mir dort ein paar Daten und schreibe später ein paar Daten zurück. Manchmal kommt es dabei zu Fehlern beim Server, die ich abfange. Dazu beende ich die bisherige Verbindung, baue eine neue auf und hole die benötigten Daten erneut.
EineKlasse[] datenVomServer = Server.Elemente;
//An dieser Stelle besteht bereits eine Verbindung
for(int i = 0; i < datenVomServer.Length; i++)
{
try
{
tuWasMit(datenVomServer[i]);
//Dabei wird auf die Daten vom Server zugegriffen...
}
catch (System.Runtime.InteropServices.COMException)
{
//Das Unterbrechen der Verbindung wird abgefangen...
Verbindung.Reconncect();
//Dann soll beim Element, das vor dem Verbindungsabbruch bearbeitet wurde, fortgesetzt werden
datenVomServer = Server.Elemente // <- Daten neu laden und mit bestehendem Index weiterarbeiten.
i--; // evt. damit das letzte Element neu bearbeitet wird
}
}
Soweit funktioniert das auch sehr gut. Allerdings bekomme ich nun das Problem, dass sich die Anwendung "aufhängt". Dies ist leider nicht deterministisch. Es kann also sein, dass die Anwendung komplett durchläuft oder es kommt zu er obigen Exception und die Daten müssen neu geladen werden. Manchmal funktioniert dies einwandfrei, manchmal hängt sich die Anwendung auch einfach auf.
Habt ihr eine Idee, wie ich das behandeln könnte? Oder wo überhaupt die Ursache dafür liegt?
Hallo Wirtschaftsinformatiker,
finde zunächst heraus, an welcher Stelle das Programm "nicht weiter arbeitet". Am einfachsten bekommst du das heraus, in dem du vor und nach jeder fraglichen Operation einen Log-Eintrag schreibst, z.B. in eine einfache Textdatei. Flush nicht vergessen.
herbivore
Ich weiß, dass dies bei Methoden auftritt, die Daten vom Server holen.
Hallo Wirtschaftsinformatiker,
etwas genauer solltest du es schon sagen. Welche Stellen? Welche Methoden? Was genau tun die? Wie erfolgt der Zugriff? Und wo genau innerhalb der Methoden hängt das Programm?
herbivore
Ok, dann werde ich mal präziser:
private IDictionary<String, ObjektVomServerKlasse> dictionaryMitServerdaten(Verbindung eineVerbindung, String pfadAufServer)
{
IDictionary<String, ObjektVomServerKlasse> meinDictionary = new Dictionary<String, ObjektVomServerKlasse>();
objektListe[] serverDaten = eineVerbindung.getListe(pfadAufServer);
for (int i = 0; i < serverDaten.Length; i++)
{
try
{
String keyObjekt = serverDaten[i].getKey();
ObjektVomServerKlasse keyName = serverDaten[i].getName();
}
catch (System.Runtime.InteropServices.COMException ex)
{
throw ex;
}
meinDictionary.Add(keyObjekt , keyName );
}
return meinDictionary;
}
Problematisch sind die beiden getMethoden. Die Schleife wird etwa 1000 mal durchlaufen.
Die Exception wird an die übergeordnete Methode weitergeleitet. Diese trennt die Verbindung, baut eine neue auf und führt die Methode ernaut aus mit dem neuen Verbindungs-Objekt.
try
{
dictionary = dictionaryMitServerdaten(eineVerbindung, pfadAufServer);
}
catch (System.Runtime.InteropServices.COMException)
{
i--;
eineVerbindung.Disconnect();
eienVerbindung =createVerbindung(loginDaten);
continue;
}
Und irgendwann gibt es eine COMException und es wird wieder versucht eine Verbindung aufzubauen... Es gibt dann wieder eine COMException und es wird wieder versucht eine Verbindung aufzubauen.... Es gibt dann wieder.......
So könnte ich es mir vorstellen...
MfG
wax
Und was kann man da tun? Wenn ich die Exception nicht abfange, ist der User gezwungen, den Vorgang abzubrechen und die Anwendung neu zu starten.
Und was kann man da tun? Wenn ich die Exception nicht abfange, ist der User gezwungen, den Vorgang abzubrechen und die Anwendung neu zu starten.
Du könntest dem Benutzer nach z.B. 10 aufgetretenen Exceptions anbieten, den Vorgang abzubrechen. In einem solchen Fall wäre es wahrscheinlich, dass evtl. was anderes schiefgelaufen ist.
Aber logge sicherheitshalber mal ein bisschen (am besten auch in den Catch-Handlern) - dann solltest du schnell sehen, wo's hakt.
Ja, ich werde das loggen.
Das mit der Endlosschleife klingt plausibel. Leider ist dieses Programm so gedacht, dass es ohne User-Interaktion nachts auf einem Server arbeiten soll, deshalb ist das Abbrechen nach einer bestimmten Zahl von Versuchen keine wirklich schöne Lösung.
Es ist aber auch nicht hilfreich wenn das Programm sich ins Endlose verläuft. - Dann lieber lasse das Programm nach x-Versuchen beenden und lasse eine Meldung aufpoppen dass etwas schief lief.
So sieht der Admin / Entwickler / Nutzer dass etwas schief lief und kann sich der Sache annehmen. Das Logging solltest du aber dennoch einbauen, so dass sich der Fehler auch schnell finden lässt.
Es ist dir nicht geholfen wenn der Fehler einfach 'as is' genommen wird und dennoch dauerhaft ignoriert wird.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |