मैं राकु में दूसरे धागे में फेंकी गई त्रुटियों को कैसे प्रचारित और पकड़ सकता हूं?


9

एक अलग थ्रेड से त्रुटियों को प्रचारित करने का सबसे अच्छा तरीका क्या है (उदाहरण के लिए ब्लॉक, प्रोक :: Async, या उप इन युक्त)। बस एक कोशिश / CATCH ब्लॉक में एक नया धागा बंद करने वाले कोड को लपेटने से काम नहीं चलता है, और केवल रूटीन के उप मान के आधार पर काम का इंतजार कर रहा है (यानी। एक उप-लौटने वाला स्वयं प्रतीक्षा दृष्टिकोण के साथ काम नहीं करेगा)।


शायद fooऔर barयहाँ समाप्त किया जा सकता है?
jjmerelo

1
मुझे अभी भी इस परिदृश्य में समस्या हो रही है ... क्या यह राकु में संभव नहीं है और वास्तविक वर्गों के पुनर्गठन की आवश्यकता है? यह आदर्श नहीं होगा क्योंकि मैं उन कक्षाओं में आवेदन विशिष्ट त्रुटि से निपटने के लिए नहीं चाहता हूं जो कहीं और फिर से उपयोग किए जा सकते हैं ...
ryn1x

@ ryn1x मेरा सुझाव है कि आप इस प्रश्न को इसके मूल रूप में बहाल करने पर विचार करें। फिर शुरू में यह बताते हुए एक नोट जोड़ें कि, हालांकि हमारे कुछ जवाबों ने आपके प्रश्न के शरीर में दिए गए समस्या कथन को हल कर दिया है, आप वास्तव में कुछ और सामान्य मांग रहे थे। इसके अलावा, जबकि आपने जो उत्तर स्वीकार किया था, वह अधिक सामान्य था, तब से आपने निष्कर्ष निकाला है कि यह अभी भी पर्याप्त रूप से सामान्य नहीं था। इसके अलावा, कि आपने अधिक सामान्यता के लिए पूछते हुए एक इनाम की कोशिश की, लेकिन इससे कोई फायदा नहीं हुआ। फिर एक नया प्रश्न लिखें , इसे एक से जोड़ते हुए, एक उदाहरण से जो आपको विश्वास है कि समस्या का वर्णन करता है।
रायफल

वर्तमान उत्तर मेरे लिए पूरी तरह से पर्याप्त है। मैंने इस सवाल को बदल दिया क्योंकि यह किसी भी व्यक्ति के लिए बहुत लंबा और विशिष्ट हो रहा था जो यहां समाप्त होता है।
ryn1x

जवाबों:


6

का उपयोग करें await

उदाहरण के लिए, अपने कोड में इन तीन पंक्तियों को प्रतिस्थापित करें:

foo;
bar;
baz;

साथ में:

await foo, bar, baz;

यह काम करता है, लेकिन मेरी वास्तविक समस्या का पैमाना नहीं था क्योंकि फू, बार, और बाज वास्तव में वे तरीके हैं जो स्वयं को वापस करते हैं। मैंने प्रश्न और उदाहरण को अद्यतन किया।
ryn1x

5

सैद्धांतिक रूप से, उस कोड को मरना चाहिए :

भाषा के 6.d संस्करण के रूप में, सिंक संदर्भ में उपयोग किए जाने वाले बयान उपसर्ग को स्वचालित रूप से एक अपवाद हैंडलर संलग्न करेगा। यदि दिए गए कोड में कोई अपवाद होता है, तो इसे प्रिंट किया जाएगा और प्रोग्राम तब बाहर निकल जाएगा, जैसे कि बिना किसी आरंभ कथन के उपसर्ग शामिल किए गए थे।

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 

इस मामले में यह एक अजीब स्थिति है क्योंकि आप वादा नहीं कर रहे हैं (आप इसे वापस कर रहे हैं), लेकिन अंततः आप इसे डूबोते हैं क्योंकि आप इसे शून्य संदर्भ में चला रहे हैं।

एक ही प्रलेखन आपको समाधान देता है: संदर्भ को सिंक न करें:

# Don't sink it: 
my $ = start { die }; sleep ⅓; say "hello"; # OUTPUT: «hello␤» 

# Catch yourself: 
start { die; CATCH { default { say "caught" } } };
sleep ⅓;
say "hello";

चूंकि आपका कार्यक्रम नहीं मरता है, मैं कहूंगा कि आप दूसरी स्थिति में हैं। किसी कारण के लिए, यह डूब नहीं है। लेकिन जो भी स्थिति है, समाधान समान है: आपको समान कोड ब्लॉक के अंदर अपवाद को पकड़ने की आवश्यकता है।

समाधान: awaitवादा (जो इसे नहीं डूबेगा) या इसे कुछ चर के लिए असाइन करें, ताकि आसपास का कोड भी मर जाए। लेकिन अपने ओपी का जवाब देते हुए, नहीं, आप किसी अन्य धागे से अपवाद नहीं पकड़ सकते हैं, उसी तरह आप किसी अन्य ब्लॉक से अपवाद नहीं पकड़ सकते हैं।


इस सब के लिए धन्यवाद। मुझे वास्तव में अपने ओपी की तुलना में अधिक विशिष्ट होने की आवश्यकता है। मैं सिंक संदर्भ में नहीं बुला रहा हूं और प्रतीक्षित समाधान भी काम नहीं कर रहा है क्योंकि ओपी के कार्य वास्तव में ऐसे तरीके हैं जो स्वयं को वापस करते हैं। मैंने प्रश्न और उदाहरण को अद्यतन किया।
ryn1x

4

चैनलों के उपयोग से गो रूट से बाहर त्रुटियों को पारित करने के लिए गो में उपयोग किए जाने वाले सम्मेलन के बाद, मुझे राकु में काम करने के लिए एक ही दृष्टिकोण मिला। मुख्य धागे द्वारा संभाला जाने वाले अतुल्यकालिक कोड से त्रुटियों को भेजने के लिए कोई चैनल का उपयोग कर सकता है।

उदाहरण:

my $errors = Channel.new;

my $err-supply = $errors.Supply;
$err-supply.tap(-> $e {say "handle error: $e"});

start {
    die "something went horribly wrong";

    CATCH {
        default {
            $errors.send($_);
        }
    }
}

sleep 1;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.