Jaki jest najlepszy sposób na propagowanie błędów z oddzielnego wątku (np. Blok startowy, Proc :: Async lub sub zawierające je). Po prostu owijanie kodu, który wypuszcza nowy wątek w bloku try / CATCH, nie działa, a użycie funkcji czekania działa tylko w zależności od zwracanej wartości podprogramu (tzn. Sub powracające self nie będzie działać z podejściem oczekiwania).
9
foo
ibar
może zostać tutaj wyeliminowany?Odpowiedzi:
Zastosowanie
await
.Na przykład zamień te trzy wiersze w kodzie:
z:
źródło
Teoretycznie ten kod powinien umrzeć :
W tym przypadku jest to dziwna sytuacja, ponieważ nie zatapiasz obietnicy (oddajesz ją), ale ostatecznie zatapiasz, ponieważ uruchamiasz ją w pustym kontekście.
Ta sama dokumentacja daje rozwiązanie: nie zatapiaj kontekstu:
Ponieważ twój program nie umiera, powiedziałbym, że jesteś w drugiej sytuacji. Z jakiegoś powodu nie jest zatopiony. Ale bez względu na sytuację rozwiązanie jest takie samo: musisz złapać wyjątek w tym samym bloku kodu.
Rozwiązanie:
await
obietnica (która jej nie zatopi) lub przypisz ją do jakiejś zmiennej, aby umarł również otaczający kod. Ale odpowiadając na OP, nie, nie możesz złapać wyjątku z innego wątku, tak samo jak nie możesz złapać wyjątku z innego bloku.źródło
Zgodnie z konwencją używaną w Go do przekazywania błędów poza procedurami Go za pomocą kanałów, znalazłem to samo podejście do pracy w Raku. Można użyć kanału do wysyłania błędów z kodu asynchronicznego, który ma być obsługiwany przez główny wątek.
Przykład:
źródło