Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Try Catch verhindert nicht das abstürzen des Windows Dienstes
Briefkasten
myCSharp.de - Member

Avatar #avatar-1523.gif


Dabei seit:
Beiträge: 446

Themenstarter:

Try Catch verhindert nicht das abstürzen des Windows Dienstes

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Technologie100
myCSharp.de - Member



Dabei seit:
Beiträge: 24

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von ErfinderDesRades am .
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.111

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Briefkasten
myCSharp.de - Member

Avatar #avatar-1523.gif


Dabei seit:
Beiträge: 446

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
chilic
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.111

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Briefkasten
myCSharp.de - Member

Avatar #avatar-1523.gif


Dabei seit:
Beiträge: 446

Themenstarter:

beantworten | zitieren | melden

Zitat von MarsStein
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
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo,
Zitat von kleines_eichhoernchen
(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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am .
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Briefkasten
myCSharp.de - Member

Avatar #avatar-1523.gif


Dabei seit:
Beiträge: 446

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers