Apa cara terbaik untuk menyebarkan kesalahan dari utas terpisah (mis. Blok start, Proc :: Async, atau sub yang mengandung ini). Cukup dengan membungkus kode yang memutar utas baru dalam blok coba / CATCH tidak berfungsi, dan menggunakan menunggu hanya berfungsi tergantung pada nilai balik dari sub rutin (mis. Diri yang kembali tidak akan bekerja dengan pendekatan menunggu).
9
foo
danbar
bisa dihilangkan di sini?Jawaban:
Gunakan
await
.Misalnya, ganti tiga baris ini dalam kode Anda:
dengan:
sumber
Secara teoritis, kode itu harus mati :
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:
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.sumber
Mengikuti konvensi yang digunakan dalam Go untuk mengeluarkan kesalahan dari rutinitas menggunakan saluran, saya menemukan pendekatan yang sama untuk bekerja di Raku. Seseorang dapat menggunakan Saluran untuk mengirim kesalahan dari kode asinkron untuk ditangani oleh utas utama.
Contoh:
sumber