Secara teoritis, kode itu harus mati :
Pada versi bahasa 6.d, awalan pernyataan awal yang digunakan dalam konteks sink akan secara otomatis melampirkan pengendali pengecualian. Jika pengecualian terjadi pada kode yang diberikan, itu akan dicetak dan program kemudian akan keluar, seperti jika dilemparkan tanpa awalan pernyataan awal yang terlibat.
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
Dalam hal ini adalah situasi yang aneh karena Anda tidak menenggelamkan janji (Anda mengembalikannya), tetapi akhirnya Anda menenggelamkannya karena Anda menjalankannya dalam konteks yang tidak jelas.
Dokumentasi yang sama memberi Anda solusinya: jangan tenggelamkan konteksnya:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
Karena program Anda tidak mati, saya akan mengatakan Anda berada dalam situasi kedua. Untuk beberapa alasan, itu tidak hangus. Tapi apa pun situasinya, solusinya sama: Anda perlu menangkap pengecualian di dalam blok kode yang sama.
Solusi: await
janji (yang tidak akan menenggelamkannya) atau menetapkannya ke beberapa variabel, sehingga kode di sekitarnya mati juga. Tetapi menanggapi OP Anda, tidak, Anda tidak dapat menangkap pengecualian dari utas lainnya, dengan cara yang sama Anda tidak dapat menangkap pengecualian dari blok lain.
foo
danbar
bisa dihilangkan di sini?