Wenn parallele Algorithmen an die Tür klopfen, ist es möglicherweise ein guter Zeitpunkt, über die Fehlerbehandlung nachzudenken.
Zuerst gab es also Fehlercodes. Die saugten. Es war kostenlos, sie zu ignorieren, sodass Sie spät ausfallen und schwer zu debuggenden Code erstellen konnten.
Dann kamen Ausnahmen. Es wurde unmöglich gemacht, diese zu ignorieren, sobald sie auftreten, und die meisten Menschen (außer Joel) mögen sie besser.
Und jetzt haben wir Bibliotheken, die parallelen Code unterstützen. Das Problem ist, dass Sie Ausnahmen im parallelen Code nicht so einfach behandeln können wie im nicht parallelen Code. Wenn Sie eine Aufgabe asynchron starten und sie eine Ausnahme auslöst, gibt es keine Stapelverfolgung, an der Sie sich abwickeln können. Das Beste, was Sie tun können, ist, es zu erfassen und im Aufgabenobjekt zu registrieren, wenn es ein solches Objekt gibt. Die primäre Stärke von Ausnahmen wird jedoch zunichte gemacht: Sie müssen nach ihnen suchen und können sie ohne zusätzlichen Aufwand ignorieren , während eine Ausnahme im Single-Thread-Code notwendigerweise die entsprechenden Aktionen auslöst (selbst wenn dies das Beenden Ihres Programms bedeutet).
Wie sollten Sprachimplementierungen oder Bibliotheken Fehler im parallelen Code unterstützen?
Antworten:
Ich bin eher gern Rückrufe für Fehler , die können behandelt werden. Und sie können dazu gebracht werden, asynchron gut zu funktionieren ...
Aber für Fehler, die nicht behandelt werden können, wirklich außergewöhnliche Fehler, möchte ich lieber die relevanten Informationen speichern und das Programm beenden. Da dies normalerweise sowieso über eine Art globalen Fehlerbehandler erfolgt, sehe ich keine Notwendigkeit, Ausnahmen in etwas zu verwandeln, das dafür funktioniert - aber eine bessere Plattformunterstützung zum Erkennen kritischer Fehler und zum Erstellen von Speicherabbildern usw. wäre hilfreich.
quelle
Anscheinend möchten Sie sicherstellen, dass die Aufgabe ihre eigenen Ausnahmen behandelt, und dann etwas zurückgeben, das das aufrufende Programm darüber informiert, dass der Thread heruntergefahren werden muss. Es wäre dann logisch, das Ergebnis aller Threads zu verarbeiten, da man weiß, dass einige dieser Threads fehlgeschlagen sind.
quelle