Announcement

Collapse
No announcement yet.

Thread Exception ignorieren

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

  • Thread Exception ignorieren

    Hallo liebes Forum,

    ich habe folgendes Problem: Ich verwende Threads, und diese können in unhandled Exceptions laufen. Meine Frage nun, wie ist es möglich, dass diese Exceptions nicht meine ganze Applikation runterreissen?

    Hintergrund:
    Ich verwende eine von mir selbst implementierte Script-Engine, die es gestattet zur Laufzeit C# Code zu kompilieren und zur Ausführung zu bringen. Dort kann ich nicht erzwingen, dass die Thread-Methode ein Try-Catch enthält (ich habe keinen Einfluss auf den Script-Inhalt). Wenn das Script nun eine unhandled Exception erzeugt, reisst es mir die ganze Applikation runter, was gelinde gesagt suboptimal ist.

    Erwünschtes Ziel:
    Thread Exceptions bestimmter Threads sollten ignorierbar sein, und diese Threads sollten sich dann einfach ohne Exception Handling beenden.

    Hier mal extrahierter BeispielCode:
    Code:
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    
    namespace TestConsole
    {
        public class TestThreadException
        {
            public TestThreadException()
            {
                Thread.GetDomain().UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    
                Thread thrTest = new Thread(new ThreadStart(ThreadStartMethod));
                Console.WriteLine("Starting thread now...");
                thrTest.Start();
                Thread.Sleep(5000);
                Console.WriteLine("Ended regularly, yeah!");
            }
    
            void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                Console.WriteLine("Fetched exception in app domain unhandled exception method!");
                Console.ReadLine();
            }
    
            private void ThreadStartMethod()
            {
                Console.WriteLine("Test!");
                int i = 3 / Convert.ToInt32("0");
            }
        }
    }
    Im Beispiel sollte dann im Idealfall folgendes ausgegeben werden:
    Starting thread now...
    Test!
    Fetched exception in app domain unhandled exception method!
    Ended regularly, yeah!

    Aber die letzte Meldung kommt natürlich nie...

    Für eine Lösung wäre ich extrem dankbar.

    Viele Grüße
    _ntr_

  • #2
    Hallo _ntr_,

    In diesem Fall mußt du dich leider in jedem Thread um das exception handling kümmern.

    Hier hab ich noch was gefunden:
    System.Windows.Forms.Application.ThreadException

    Hoffe es hilft dir weiter!

    Martin
    Grüße,

    Martin

    Comment


    • #3
      Hallo Martin#,

      naja, da es bei mir um ein Backend handelt, hilft mir WinForms hier nicht weiter. Außerdem ist die "Thread.GetDomain().UnhandledException" Ebene noch ein Stück höher in der Hierarchie.

      Danke Dir aber trotzdem.

      Habe von meinem Kollegen einen sehr brauchbaren Workaround-Tipp bekommen. Ich werde eine Basisklasse erstellen (von mir definiert), die eine interne "RunThreadInternal"-Methode anbietet, die eine abstrakte Methode "RunThread" aufruft. Die "RunThread" Methode wird hier aber mittels einem Try-Catch aufgerufen, so dass Thread-Fehlermeldungen in der Basisklasse landen ;-)

      Dann kann ich sie ignorieren UND sogar vorher eine Log-Message generieren, das ist wunderbar ;-)

      Viele Grüße
      _ntr_

      Comment

      Working...
      X