Về mặt lý thuyết, mã đó sẽ chết :
Kể từ phiên bản 6.d của ngôn ngữ, tiền tố câu lệnh start được sử dụng trong ngữ cảnh chìm sẽ tự động đính kèm một trình xử lý ngoại lệ. Nếu một ngoại lệ xảy ra trong mã đã cho, nó sẽ được in và chương trình sẽ thoát, giống như nếu nó bị ném mà không có bất kỳ tiền tố câu lệnh bắt đầu nào liên quan.
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
Trong trường hợp này, đó là một tình huống kỳ lạ bởi vì bạn không thực hiện lời hứa (bạn sẽ trả lại nó), nhưng cuối cùng bạn lại chìm đắm vì bạn đang thực hiện nó trong bối cảnh trống rỗng.
Tài liệu tương tự cung cấp cho bạn giải pháp: không nhấn chìm bối cảnh:
# Don't sink it:
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello»
# Catch yourself:
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";
Vì chương trình của bạn không chết, tôi sẽ nói bạn đang ở tình huống thứ hai. Vì một số lý do, nó không bị chìm. Nhưng bất kể là tình huống nào, giải pháp đều giống nhau: bạn cần bắt ngoại lệ bên trong cùng một khối mã.
Giải pháp: await
lời hứa (sẽ không nhấn chìm nó) hoặc gán nó cho một số biến, để mã xung quanh cũng chết. Nhưng trả lời OP của bạn, không, bạn không thể bắt ngoại lệ từ một luồng khác, giống như cách bạn không thể bắt ngoại lệ từ một khối khác.
foo
vàbar
có thể được loại bỏ ở đây?