Aufgabe nicht behandelte Ausnahmen

8

Ich versuche zu verstehen, was mit Ausnahmen passiert, die innerhalb eines Aufgabenobjekts geworfen und nie behandelt werden.

Auf MSDn heißt es:

  

Wenn Sie nicht auf eine Aufgabe warten, die eine Ausnahme oder einen Zugriff ausgibt   seine Exception - Eigenschaft wird die Exception entsprechend der   .NET-Ausnahmerichtlinie, wenn die Aufgabe Garbage-Collected ist.

Ich verstehe also nicht genau, auf welche Weise diese Ausnahmen den Programmfluss beeinflussen. Ich dachte, dass diese Ausnahmen die Ausführung unterbrechen sollten, sobald sie von Müll gesammelt wurden. Aber ich kann dieses Verhalten nicht entwerfen. Innerhalb des folgenden Snippets wird die ausgelöste Ausnahme nicht angezeigt.

%Vor%

Bitte, kann jemand erklären, wie unbehandelte Aufgaben Ausnahme behandelt werden, und wie sie den Programmablauf beeinflussen.

    
user3101007 08.02.2014, 15:49
quelle

1 Antwort

18

Sie beschreiben das Verhalten so, wie es in .NET 4 war, aber es wird schwierig für Sie sein, die Speicherbereinigung zu erzwingen und dieses Verhalten tatsächlich zu beobachten. Das folgende Zitat aus Stephen Toubs excellent writ-up zu diesem Thema sollte Machen Sie es noch deutlicher:

  

Aufgaben verfolgen, ob eine nicht behandelte Ausnahme aufgetreten ist   "Beobachtet". In diesem Zusammenhang bedeutet "beobachtet", dass Code beigetreten ist   mit der Aufgabe in gewisser Weise, um zumindest darauf aufmerksam gemacht zu werden   die Ausnahme. Dies könnte Wait / WaitAll auf der Task aufrufen. Es   könnte die Exception-Eigenschaft der Task nach der Task überprüfen   abgeschlossen. Oder es könnte die Ergebniseigenschaft einer Aufgabe verwenden.   Wenn eine Aufgabe sieht, dass ihre Ausnahme in irgendeiner Weise beobachtet wurde,   Das leben ist gut. Wenn jedoch alle Verweise auf eine Aufgabe entfernt werden   (die Aufgabe für die Garbage Collection verfügbar machen) und falls es   Ausnahme wurde noch nicht beobachtet, die Task kennt diese Ausnahme   wird nie beobachtet werden. In einem solchen Fall nutzt die Task den Vorteil   Finalisierung und verwendet ein Hilfsobjekt, um das unbehandelte Objekt weiterzugeben   Ausnahme im Finalizer-Thread. Mit dem beschriebenen Verhalten   früher wird diese Ausnahme im Finalizer-Thread nicht behandelt und   Rufen Sie die standardmäßige unbehandelte Ausnahmelogik auf, die den   ausstellen und den Prozess abstürzen.

Er schlug auch zwei nützliche Erweiterungsmethoden für die Behandlung von Ausnahmen in "fire-and-forget" -Tasks vor: Einer ignoriert die Ausnahme und der andere stürzt den Prozess sofort ab:

%Vor%

In .NET 4.5 hat sich das Standardverhalten geändert. Nochmals ein Zitat von einem anderen Beitrag von Stephen Toub zum Thema (danke (um mich darauf aufmerksam zu machen, in den Kommentaren):

  

Um Entwicklern das Schreiben von asynchronem Code zu erleichtern   Aufgaben, .NET 4.5 ändert das Standardausnahmeverhalten für unbeobachtet   Ausnahmen. Während unbeobachtete Ausnahmen immer noch die verursachen   UnobservedTaskException - Ereignis ausgelöst werden (dies wäre nicht möglich)   breaking change), stürzt der Prozess standardmäßig nicht ab. Vielmehr   Ausnahme wird nach der Veranstaltung gegessen,   unabhängig davon, ob ein Event-Handler die Ausnahme beobachtet. Dies   Verhalten kann jedoch konfiguriert werden.

    
Damir Arh 08.02.2014, 16:13
quelle

Tags und Links