Laden...

Im eigenen Thread eine Exception werfen

Erstellt von cluening vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.298 Views
C
cluening Themenstarter:in
75 Beiträge seit 2006
vor 15 Jahren
Im eigenen Thread eine Exception werfen

Hallo Community,

ich benötige mal einmal euren Rat.

Und zwar möchte ich von meinem Main-Thread zwei weitere Threads starten. In einem dieser Threads soll bei einem Fehlerfall eine Exception geworfen werden. Diese Exception würde ich aber gerne in dem Mainthread behandeln.

  1. Main-Thread startet Thread 1
  2. Main-Thread startet Thread 2
  3. Thread 1 wirft Exception
  4. Main-Thread behandelt Exception

Bisher bekomm ich immer eine Unhandled Exception! Ich hab schon nen bisschen im Internet rumgesucht und bin darauf gestoßen das Application.Thread Exception Event zu nutzen. Bin mir aber noch nicht ganz sicher ob es das erfüllt was ich genau suche.

Oder sollte ich evtl. ein Event anstelle einer Exception nutzen? Dass ich ein Event auslöse, wenn der Fehler auftritt. Das wäre zwar wahrscheinlich nicht im Sinne des Erfinders, aber vllt. die einfachste Lösung?

Was meint ihr dazu?

Vielen Dank
cluening

3.511 Beiträge seit 2005
vor 15 Jahren

Oder sollte ich evtl. ein Event anstelle einer Exception nutzen?

So ist es.
Behandle die Exception in dem Thread in den diese AUftritt und per Events teilst du der Aussenwelt nur mit, das etwas schiefgegangen ist.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

C
cluening Themenstarter:in
75 Beiträge seit 2006
vor 15 Jahren

Vielen Dank für die schnelle Antwort!

Und wenn dort mehrere verschiedene Fehler auftreten können, würdest du dann die Exception noch in ein EventArgs Objekt verpacken? Oder jeweils ein eigenständiges Event dafür definieren?

Gruß
cluening

3.511 Beiträge seit 2005
vor 15 Jahren

Ich persönlich würde zu einem Event tendieren, in dem die Exception in den EventArgs liegt.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen,

in aller Kürze: Man kann weder Events noch Exceptions über Thread-Grenzen hinweg feuern/werfen. Die Exception-Behandlung läuft in dem Thread, der die Exception schmeißt und alle EventHandler laufen in dem Thread, der den Event feuert.

Die ganze Geschichte gibt es in Eigene Exceptions in einem Thread werden nicht abgefangen

herbivore

3.511 Beiträge seit 2005
vor 15 Jahren

Das verstehe ich jetzt nicht ganz. Wieso sollte ein Thread nicht ein Event eines anderen Threads abonnieren können? Oder habe ich dich da falsch verstanden?

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
497 Beiträge seit 2006
vor 15 Jahren

der Eventhandler läuft immer in dem Thread, der das Event ausgelöst hat. Warum ist dir denn überhaupt wichtig, daß der Mainthread das Event bearbeitet?

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Khalid,

klar kann ein Thread Events eines anderen Thread abonnieren. Aber wie in Eigene Exceptions in einem Thread werden nicht abgefangen ausführlich erläutert läuft der EventHandler nicht in dem Thread, der den Event abonniert hat, sondern in dem, der den Event feuert.

herbivore

3.511 Beiträge seit 2005
vor 15 Jahren

Achso, das ist ja klar. Dachte ich hab seit Jahren was falsch gemacht puh 🙂

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Khalid,

kommt darauf an, was du unter richtig und falsch verstehst. 🙂 Durch das einfache Abonnieren eines Events eines anderen Threads wird das oben Gewünschte eben nicht erreicht:

  1. Main-Thread startet Thread 1
  2. Main-Thread startet Thread 2
  3. Thread 1 wirft Exception
  4. Main-Thread behandelt Exception

herbivore

3.511 Beiträge seit 2005
vor 15 Jahren

Oh, ich meinte es eigentlich anders.

  1. Main-Thread startet Thread 1
  2. Thread 1 führt Berechnung durch
  3. Thread 1 wirft Exception
  4. Thread 1 behandelt Exception und feuert danach ein Event in dem die Exception drin liegt*.

Der Main-Thread weis jetzt nur welche Exception aufgetreten ist. Der hat sich natürlich nicht darum zu kümmern, was passiert. Das mus ja halt der Thread alleine machen.

So meinte ich das. Ich mache das selber so an einigen Stellen und war bis jetzt zufrieden damit. Bin natürlich für bessere Vorgehenweisen immer zu haben 🙂

[Edit]
*Die Exception ist zu dem Zeitpunkt schon längst behandelt worden.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

G
497 Beiträge seit 2006
vor 15 Jahren

was genau meinst du mit

Der Main-Thread weis jetzt nur welche Exception aufgetreten ist. Der hat sich natürlich nicht darum zu kümmern, was passiert. Das mus ja halt der Thread alleine machen.

Ein Thread kann nichts "wissen". Sei dir bewusst, daß der Mainthread von der Exception und auch von dem Event unbeeinflusst weiterläuft. Was du machen kannst, um im Mainthread etwas über gegebenenfalls aufgetretene Ausnahmen zu erfahren: du kannst im Event, das du nach der Ausnahme auslöst, die Details der Ausnahme in einem Feld, z. B. einer statischen Liste, ablegen. Auf diese Liste greifen dann sowohl der Worker als auch der Hauptthread zu, der Hauptthread kann darüber Details zur Ausnahme abholen.

Gefährlich dabei: solche Zugriffe auf Listen und Felder über mehrere Threads hinweg können zu kaum auffindbaren Ablauffehlern führen. Deshalb sollte man für die Felder, die auf diese Art genutzt werden, einen Sperrmechanismus (Stichworte "lock", System.Threading.Monitor) einführen. Der sorgt dafür, daß ein Thread mit seinem Zugriff wartet, wenn der andere Thread gerade die Sperre hält.

3.511 Beiträge seit 2005
vor 15 Jahren

Ein Thread kann nichts "wissen". Sei dir bewusst, daß der Mainthread von der Exception und auch von dem Event unbeeinflusst weiterläuft

Das ist klar. Ich weis jetzt nicht genau was du mit deinem ersten Satz meinst. Alles was ich in die EventArgs packe, ist dann jedem anderen Thread bekannt. Die "wissen" also schon bescheid.

Was du machen kannst, um im Mainthread etwas...

Der 2. Thread wirft ein Event, wobei die EventArgs so erweitert sind, das ein Exception Objekt enthalten ist. Da brauche ich keine statischen Listen, wo beide Threads drauf zugreifen können. Was dann auch deine nächsten bedenken ausschließt.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Khalid,

Alles was ich in die EventArgs packe, ist dann jedem anderen Thread bekannt.

nein, die EventArgs werden per Parameter an die EventHandler übergeben. Die EventHandler laufen in dem Thread, der den Event gefeuert hat. Die EventArgs sind also nur in diesem Thread bekannt.

Der 2. Thread wirft ein Event, wobei die EventArgs so erweitert sind, das ein Exception Objekt enthalten ist. Da brauche ich keine statischen Listen, wo beide Threads drauf zugreifen können. Was dann auch deine nächsten bedenken ausschließt.

Nein, auch das stimmt nicht. Der Main-Thread läuft völlig unbeeindruckt von dem Event weiter. Es sei denn in dem EventHandler werden irgendwelche Variablen gesetzt, auf die der Main-Thread Zugriff hat und tatsächlich abfragt. Das müssen zwar keine statischen Variablen und überhaupt kann man "Variable" hier sehr weit fassen (normale Variable, aber auch Semaphore, Monitor, ...) sein, aber ansonsten hat GarlandGreene Recht.

Ich finde es nur Schade, dass wir das alles hier wiederholen müssen, weil das in dem anderen Foren-Thread alles schon ausführlich erklärt ist. Und weitere Infos gibt es über die Forensuche, z.B. in Threads queuen (Beispiel aus Buch).

herbivore

PS: Man muss unterscheiden zwischen Daten- und Kontrollfluss.

3.511 Beiträge seit 2005
vor 15 Jahren

Hallo,

irgendwie habe ich gerade das Gefühl mir geht es wie norman_timo im anderen Forenthread

Also habe ich (mal wieder) das Richtige gemeint, aber das Falsche geschrieben

Ich finde es nur Schade, dass wir das alles hier wiederholen müssen, weil das in dem anderen Foren-Thread alles schon ausführlich erklärt ist.

Deswegen gebe ich mich hier geschlagen 🙂

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)