Laden...

Try Catch verhindert nicht das abstürzen des Windows Dienstes

Erstellt von Briefkasten vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.454 Views
Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 14 Jahren
Try Catch verhindert nicht das abstürzen des Windows Dienstes

Hallo,

ich habe einen Windows Dienst welcher Module (z.b ein Plugin dritter) beim ersten mal Starten ladet.

Der Dienst speichert jedes dieser Modul in eine Liste.

_IModul = new List<IModul >();

Anschließend führt er in einem seperaten Thread diese Methode aus:

public void LoadModuls(object args)
        {
            try
            {
                foreach (var Modul in _IModul)
                {
                    if (Modul != null)
                    {
                        
                        try
                        {
                            Modul.TuWas(_log, args as string[]);
                        }
                        catch (Exception e)
                        {

                            //Modul hat eine Exception ausgelöst, also schmeißen wir das Modul raus
                            _IModul.Remove(fileSync);
                        }

                    }
                }
            }
            catch (Exception e)
            {

            }
        }

Mit einer Schleife gehe ich alle Module/Plugins durch und starte die TuwasFunktion. Wenn die TuWas Funktion eine Unbehandelte Except auslöst stürzt der komplette Windows Dienst ab. Ich versteh nicht, warum er nicht in den catch Block geht.

Habt ihr eine Idee warum das so sein könnte?

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

T
24 Beiträge seit 2010
vor 14 Jahren

Hallo,

Debug-Modus und schauen wo der Fehler ist. Sollte die Try-Schleife in den 2 Catch Block springen solltest du mal die Exception Message hinein edieren.

MFG

5.299 Beiträge seit 2008
vor 14 Jahren

im allgemeinen isses keine gute Idee, innerhalb einer Foreach-Iteration aus der iterierten Auflistung was rauszuwerfen.
gugge auch Auflistungs-Elemente suchen und entfernen

ob das nun schon die ganze lösung ist, k.A., aber bestimmt ein Teil davon.

Der frühe Apfel fängt den Wurm.

C
2.122 Beiträge seit 2010
vor 14 Jahren

Wenn man in foreach das aufgelistete Element verändert knallt es, das hab ich auch schon erlebt. Ich tippe also schwer drauf dass das am Absturz schuld ist.
Warum dann allerdings das äußere catch nicht zieht, ist mir nicht klar.
Wär interessant wenn Briefkasten da noch ein bisschen debuggt und uns sagt was da abgeht.

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 14 Jahren

Hallo,

danke für den hinweis mit der Foreach-Iteration, darauf hätte ich selbst auch kommen müssen.

Ich werde jetzt schauen, ob es daran gelegen ist. Weil eigentlich hätte der äußere catch Block die foreach Exception abfangen müssen.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

C
2.122 Beiträge seit 2010
vor 14 Jahren

Ja probier mal interessehalber noch ein bisschen rum.
Ich hab auch das Gefühl dass ein Service eher komplett aussteigt als ein fensterbasiertes Programm. Du kannst ja vielleicht den Code mal in ein normales Programm übernehmen und rausfinden ob es da anders reagiert.

3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

werden in den Modulen vielleicht noch eigene Threads gestartet? Wenn es in einem anderen Thread kracht, kann der Service abrauchen, ohne daß Dein try-catch etwas davon mitkriegt.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 14 Jahren

werden in den Modulen vielleicht noch eigene Threads gestartet? Wenn es in einem anderen Thread kracht, kann der Service abrauchen, ohne daß Dein try-catch etwas davon mitkriegt.

Das wird der Fall sein.

Ich speichere alle initialisierten Module in eine Liste. Diese Module werfen während der Laufzeit Events. Das heißt eine Exception muss nicht unbedingt beim Aufrufen der Funktion TuWas geworfen werden.

Aber wie soll ich die Exception vom Modul abfangen, wenn ich nicht weiß, wann sie geworfen wird...

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

versuch die Exceptions in den Threads selbst zu fangen (try-catch um den Inhalt der Threadmethode).
Dann kannst Du den Thread sauber beenden. Du könntest sogar vorher noch dem Threadstarter per Event mitzuteilen, welche Exception in welchem Modul geflogen ist und dort entsprechend reagieren, z.B. den Thread joinen und neu starten.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.971 Beiträge seit 2006
vor 14 Jahren

Die allerletzte Chance eine Unbehandelte Ausnahme zu Loggen (Abfangen sollte vermieden werden!), geht über das AppDomain.UnhandledException-Ereignis

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

3.170 Beiträge seit 2006
vor 14 Jahren

Hallo,

(Abfangen sollte vermieden werden!) Warum denn? Das hängt IMHO ganz von den Umständen ab, gerade bei einem Dienst würde ich versuchen die Exception zu fangen um dann zu entscheiden ob ich weiterleben kann oder mich sauber beende.

Gruß, MarsStein

Edit: Oder meintest Du das speziell auf dieses Ereignis bezogen?

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

3.971 Beiträge seit 2006
vor 14 Jahren

Ist nur auf das Eregnis bezogen. Eine Fehlerbehandlung an dieser Stelle ist aus logischer Sicht nicht mehr möglich. Nur zu Debug- oder Logging-Zwecken sollte das Event gebraucht werden.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 14 Jahren

Ich werde jetzt so vorgehen, dass ich jedes Modul / Plugin in einem seperaten AppDomain ausführen werde.

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp