सैद्धांतिक रूप से, उस कोड को मरना चाहिए :
भाषा के 6.d संस्करण के रूप में, सिंक संदर्भ में उपयोग किए जाने वाले बयान उपसर्ग को स्वचालित रूप से एक अपवाद हैंडलर संलग्न करेगा। यदि दिए गए कोड में कोई अपवाद होता है, तो इसे प्रिंट किया जाएगा और प्रोग्राम तब बाहर निकल जाएगा, जैसे कि बिना किसी आरंभ कथन के उपसर्ग शामिल किए गए थे।
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
इस मामले में यह एक अजीब स्थिति है क्योंकि आप वादा नहीं कर रहे हैं (आप इसे वापस कर रहे हैं), लेकिन अंततः आप इसे डूबोते हैं क्योंकि आप इसे शून्य संदर्भ में चला रहे हैं।
एक ही प्रलेखन आपको समाधान देता है: संदर्भ को सिंक न करें:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
चूंकि आपका कार्यक्रम नहीं मरता है, मैं कहूंगा कि आप दूसरी स्थिति में हैं। किसी कारण के लिए, यह डूब नहीं है। लेकिन जो भी स्थिति है, समाधान समान है: आपको समान कोड ब्लॉक के अंदर अपवाद को पकड़ने की आवश्यकता है।
समाधान: await
वादा (जो इसे नहीं डूबेगा) या इसे कुछ चर के लिए असाइन करें, ताकि आसपास का कोड भी मर जाए। लेकिन अपने ओपी का जवाब देते हुए, नहीं, आप किसी अन्य धागे से अपवाद नहीं पकड़ सकते हैं, उसी तरह आप किसी अन्य ब्लॉक से अपवाद नहीं पकड़ सकते हैं।
foo
औरbar
यहाँ समाप्त किया जा सकता है?