Ich habe gerade erfahren, dass .NET 4.5 eine Änderung in der Behandlung von Ausnahmen in a eingeführt hat Task
. Sie werden nämlich leise unterdrückt.
Die offizielle Begründung dafür scheint zu sein: "Wir wollten unerfahrenen Entwicklern gegenüber freundlicher sein":
In .NET 4.5 haben Aufgaben eine deutlich höhere Bedeutung als in .NET 4, da sie als Teil der neuen asynchronen Funktionen, die von den Sprachen unterstützt werden, in die Sprachen C # und Visual Basic integriert sind. Dies verschiebt Aufgaben aus dem Bereich erfahrener Entwickler in den Bereich aller. Infolgedessen führt dies auch zu einer Reihe neuer Kompromisse hinsichtlich der Einhaltung der Ausnahmebehandlung.
( Quelle )
Ich habe gelernt zu vertrauen, dass viele der Entscheidungen in .NET von Leuten getroffen wurden, die wirklich wissen, was sie tun, und es gibt normalerweise einen sehr guten Grund für die Dinge, die sie entscheiden. Aber dieser entgeht mir.
Wenn ich meine eigene asynchrone Aufgabenbibliothek entwerfe, welchen Vorteil hat das Verschlucken von Ausnahmen, die die Entwickler des Frameworks gesehen haben und die ich nicht sehe?
Antworten:
Für das, was es wert ist, gibt das Dokument, mit dem Sie verlinkt haben, einen Beispielfall als Begründung:
Das überzeugt mich nicht. Es beseitigt die Möglichkeit eines eindeutigen, aber schwer zu verfolgenden Fehlers (mysteriöser Programmabsturz, der lange nach dem eigentlichen Fehler auftreten kann), ersetzt ihn jedoch durch die Möglichkeit eines völlig stillen Fehlers, der später zu einem ebenso schwer zu verfolgenden Problem werden kann in Ihrem Programm. Das scheint mir eine zweifelhafte Entscheidung zu sein.
Das Verhalten ist konfigurierbar - aber natürlich werden 99% der Entwickler nur das Standardverhalten verwenden, ohne an dieses Problem zu denken. Was sie als Standard ausgewählt haben, ist also eine große Sache.
quelle
op1
, nicht wahr? Wenn dieser unbehandelt bleibt, wird er den Prozess zum Erliegen bringen, oder?op1
die Ausnahme nochop2
die Ausnahme das Programm zum Erliegen bringen. Der Vorteil ist, dass Sie die Möglichkeit haben, beide zu beobachten. Wenn Sie dies nicht tun, werden beide verschluckt. Ich könnte mich jedoch irren.TL; DR - Nein , Sie sollten Ausnahmen nicht einfach leise ignorieren.
Schauen wir uns die Annahmen an.
MS hat zweifellos einige wirklich brillante Mitarbeiter. Sie haben auch eine Reihe von Managern und Führungskräften, die ... ahnungslos sind und durchweg schlechte Entscheidungen treffen. So sehr wir dem Märchen des technisch versierten Wissenschaftlers glauben möchten, der die Produktentwicklung vorantreibt, ist die Realität weitaus düsterer.
Mein Punkt ist, wenn Ihr Instinkt Ihnen sagt, dass etwas möglicherweise nicht stimmt, besteht eine gute Chance (und ein früherer Präzedenzfall), dass es falsch ist.
Der Umgang mit Ausnahmen ist in diesem Fall eine Entscheidung über menschliche Faktoren, keine technische Entscheidung. Eine Ausnahme ist locker ein Fehler. Die Darstellung des Fehlers liefert dem Endbenutzer wichtige Informationen, auch wenn diese schlecht formatiert sind. Es ist nämlich etwas schief gelaufen.
Betrachten Sie diese hypothetische Konversation zwischen einem Endbenutzer und einem Entwickler.
Unser armer, glücklicherweise hypothetischer Entwickler muss jetzt herausfinden, was in der Kette der Ereignisse schief gelaufen ist. Wo war es?
Event-Handler-Benachrichtigung -> Routine zur Behandlung des Ereignisses -> Vom Handler ausgelöste Methode -> Beginn des asynchronen Aufrufs -> die 7 Schichten des OSI-Netzwerks -> physische Übertragung -> Sichern der 7 Schichten des OSI-Netzwerks -> Empfangsdienst -> vom Dienst aufgerufene Methode -> ... -> vom Dienst gesendete Antwort zurückgeben -> .... -> asynchrone Quittung -> Verarbeitung der asynchronen Antwort -> ...
Und bitte beachten Sie, dass ich dort einige mögliche Fehlerpfade beschönigt habe.
Nachdem ich einige der zugrunde liegenden Annahmen angesprochen habe, wird mir klarer, warum es eine schlechte Idee ist, Ausnahmen stillschweigend zu unterdrücken. Eine Ausnahme und die damit verbundene Fehlermeldung sind ein Schlüsselindikator für die Benutzer, dass ein Fehler aufgetreten ist. Selbst wenn die Nachricht für den Endbenutzer bedeutungslos ist, können die eingebetteten Informationen für den Entwickler hilfreich sein, um zu verstehen, was schief gelaufen ist. Wenn sie Glück haben, führt die Nachricht sogar zur Lösung.
Ich denke, ein Teil des Problems hier ist, dass eine falsch behandelte Ausnahme Ihre Anwendung zum Absturz bringt. Durch Unterdrücken der Ausnahmen stürzt die Anwendung nicht ab. Dies hat jedoch eine gewisse Gültigkeit, da der asynchrone Punkt darin besteht, der Anwendung zu ermöglichen, weiter zu arbeiten, während Daten abgerufen werden. Es ist keine logische Erweiterung zu sagen, dass ein Fehler beim Abrufen auch die Anwendung nicht zum Absturz bringen sollte, wenn Sie während des Wartens auf die Ergebnisse weiterarbeiten könnten - der asynchrone Aufruf wird implizit als nicht wichtig genug deklariert, um die Anwendung zu beenden.
Es ist also eine Lösung, aber es löst das falsche Problem. Es ist nicht so aufwendig, einen Wrapper für die Ausnahmebehandlung bereitzustellen, damit die Anwendung weiterhin ausgeführt werden kann. Die Ausnahme wird abgefangen, eine Fehlermeldung wird auf dem Bildschirm angezeigt oder protokolliert, und die Anwendung kann weiter ausgeführt werden. Das Unterdrücken der Ausnahme bedeutet, dass das Ignorieren von Fehlern A-OK ist und dass Ihre Tests sicherstellen, dass Ausnahmen sowieso nie ins Feld gelangen.
Meine abschließende Einschätzung ist also, dass dies ein halbherziger Versuch ist, ein Problem zu lösen, das dadurch entsteht, dass Menschen in ein asynchrones Modell gedrängt werden, wenn sie nicht bereit waren, ihr Denken auf diesen Ansatz zu verlagern.
quelle