Theoretisch sollte dieser Code sterben :
Ab der 6.d-Version der Sprache wird durch das im Senkenkontext verwendete Präfix für Startanweisungen automatisch ein Ausnahmebehandlungsprogramm angehängt. Wenn im angegebenen Code eine Ausnahme auftritt, wird diese gedruckt und das Programm wird beendet, als ob es ohne Präfixe für Startanweisungen ausgelöst worden wäre.
use v6.c;
start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
use v6.d;
start { die }; sleep ⅓; say "hello";
# OUTPUT:
# Unhandled exception in code scheduled on thread 4
# Died
# in block at -e line 1
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:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
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.
foo
undbar
kann hier beseitigt werden?