Was ist der beste Weg, um Fehler aus einem separaten Thread zu verbreiten (z. B. Startblock, Proc :: Async oder Sub, der diese enthält). Das einfache Umschließen des Codes, der einen neuen Thread in einen try / CATCH-Block spinnt, funktioniert nicht, und die Verwendung von await funktioniert nur in Abhängigkeit vom Rückgabewert der Subroutine (dh ein Sub, das self zurückgibt, funktioniert nicht mit dem await-Ansatz).
9
foo
undbar
kann hier beseitigt werden?Antworten:
Verwenden Sie
await
.Ersetzen Sie beispielsweise diese drei Zeilen in Ihrem Code:
mit:
quelle
Theoretisch sollte dieser Code sterben :
In diesem Fall ist es eine seltsame Situation, weil Sie das Versprechen nicht versenken (Sie geben es zurück), aber schließlich versenken Sie es, weil Sie es in einem leeren Kontext ausführen.
Dieselbe Dokumentation gibt Ihnen die Lösung: Versenken Sie den Kontext nicht:
Da Ihr Programm nicht stirbt, würde ich sagen, dass Sie sich in der zweiten Situation befinden. Aus irgendeinem Grund ist es nicht versenkt. In jeder Situation ist die Lösung dieselbe: Sie müssen die Ausnahme innerhalb desselben Codeblocks abfangen.
Lösung:
await
das Versprechen (das es nicht versenkt) oder es einer Variablen zuweisen, so dass auch der umgebende Code stirbt. Wenn Sie jedoch auf Ihr OP antworten, können Sie keine Ausnahme von einem anderen Thread abfangen, genauso wie Sie keine Ausnahme von einem anderen Block abfangen können.quelle
Nach der in Go verwendeten Konvention zum Übergeben von Fehlern aus Go-Routinen mithilfe von Kanälen habe ich den gleichen Ansatz für die Arbeit in Raku gefunden. Man kann einen Kanal verwenden, um Fehler aus dem asynchronen Code zu senden, der vom Hauptthread behandelt werden soll.
Beispiel:
quelle