ในทางทฤษฎีรหัสนั้นควรตาย :
สำหรับภาษาเวอร์ชัน 6.d คำนำหน้าคำสั่งเริ่มต้นที่ใช้ในบริบท sink จะแนบตัวจัดการข้อยกเว้นโดยอัตโนมัติ หากมีข้อยกเว้นเกิดขึ้นในรหัสที่กำหนดมันจะถูกพิมพ์และโปรแกรมจะออกจากนั้นเหมือนกับว่ามันถูกโยนโดยไม่มีคำนำหน้าคำสั่งเริ่มต้นใด ๆ ที่เกี่ยวข้อง
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
สัญญา (ซึ่งจะไม่ทำให้จม) หรือกำหนดให้กับตัวแปรบางตัวเพื่อให้โค้ดที่ล้อมรอบตายเกินไป แต่การตอบสนอง OP ของคุณไม่คุณไม่สามารถรับข้อยกเว้นจากเธรดอื่นได้เช่นเดียวกับที่คุณไม่สามารถรับข้อยกเว้นจากบล็อกอื่น
foo
และbar
สามารถถูกกำจัดได้ที่นี่?