Teorik olarak, bu kod ölmelidir :
Dilin 6. d sürümünden itibaren, lavabo bağlamında kullanılan start deyimi öneki otomatik olarak bir istisna işleyici ekleyecektir. Verilen kodda bir istisna oluşursa, yazdırılır ve program, herhangi bir start deyimi öneki olmadan atılmış gibi çıkar.
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
Bu durumda bu garip bir durumdur çünkü sözünü batırmıyorsunuz (iade ediyorsunuz), ama sonunda batırdınız çünkü boş bağlamda çalıştırıyorsunuz.
Aynı belgeler size çözüm sunar: içeriği batırmayın:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
Programınız ölmediği için ikinci durumda olduğunuzu söyleyebilirim. Bazı nedenlerden dolayı battı değil. Ancak durum ne olursa olsun, çözüm aynıdır: istisnayı aynı kod bloğu içinde yakalamanız gerekir.
Çözüm: await
vaat (onu batırmayacak) veya bir değişkene atar, böylece çevredeki kod da ölür. Ancak OP'nize yanıt verirseniz, hayır, başka bir iş parçacığından bir istisna yakalayamazsınız, aynı şekilde başka bir bloktan bir istisna yakalayamazsınız.
foo
vebar
burada elimine edilebilir?