2017-04-05 21 views
5

मैं पर्ल 6 के नियंत्रण अपवादों के साथ खेल रहा हूं। एक warn एक नियंत्रण अपवाद उठाता है जो सामान्य अपवाद नियंत्रण प्रवाह के लिए अदृश्य है, और यह अपवाद स्वयं को फिर से शुरू करता है। यह थोड़े शांत है।मुझे पर्ल 6 चेतावनी नियंत्रण अपवाद कहां पकड़ना चाहिए?

तो, इसके साथ खेलकर, मैंने यह देखने के लिए लिखा कि क्या होगा।

use v6; 

try { 
    CONTROL { 
     put "Caught an exception, in the try"; 
     put .^name; 
     } 
    do-that-thing-you-do(); 
    } 

sub do-that-thing-you-do { 
    CONTROL { 
     put "Caught an exception, in the sub"; 
     put .^name; 
     } 
    warn "This is a warning"; 
    } 

यह दोनों आग की तरह दिखता है:

Caught an exception, in the sub 
CX::Warn 
Caught an exception, in the try 
CX::Warn 
This is a warning 
    in sub do-that-thing-you-do at resume.p6 line 16 
MoarVM panic: Trying to unwind over wrong handler 

सूचना वहाँ एक Moar आतंक है, जो I've raise an issue for मैं किसी खास को देखने पर्ल 6 वास्तव में क्या करता है के अलावा अन्य समस्या को हल करने का प्रयास नहीं कर रहा हूँ। लेकिन, मैं वास्तव में इसके बारे में नहीं पूछ रहा हूँ।

मैं यहां प्रवाह की तस्वीर के बारे में उत्सुक हूं। मुझे उम्मीद है कि उप में CONTROL अपवाद और फिर से शुरू करेगा, इसलिए यह try तक नहीं होगा। यह प्रवाह कैसे होना चाहिए?

इसके अलावा, अपवाद देखें CX::Warn। मुझे नहीं लगता कि मैं अजीब कुछ किया है, लेकिन Perl 6 types भी सूची नहीं है X::Warn

+0

ध्यान दें कि संपूर्ण 'सीएक्स ::' नामस्थान उस पृष्ठ पर दस्तावेज नहीं है ... – Christoph

+1

कृपया अनुपलब्ध दस्तावेज़ों के लिए https://github.com/perl6/doc पर कोई समस्या जोड़ें। धन्यवाद! –

+0

डॉक्टर समस्या: https://github.com/perl6/doc/issues/1268 –

उत्तर

5

डिफ़ॉल्ट चेतावनी हैंडलर के रूप में समान व्यवहार प्राप्त करने के लिए, तो यह दोनों के लिए आवश्यक है अपवाद (पकड़ने CATCH साथ के रूप में, स्मार्टफोन के बिना CONTROL फिर से फेंक देगा) और इसके बाद resume भी होगा।

CONTROL { 
    when CX::Warn { 
     say "Warning: $_"; 
     .resume 
    } 
} 

sub foo() { 
    say 1; 
    warn 'oh gosh...'; 
    say 2;    # Not reached without .resume 
} 
foo(); 

कई अन्य नियंत्रण अपवाद भी हैं, और इसलिए यह केवल CX::Warn पर से मेल के बजाय default उपयोग करने के लिए बुद्धिमान है। अन्यथा, take, next, last, emit, done (और, 6. डी में, शायद await) आपके हैंडलर द्वारा नेट किया जा सकता है, जो निश्चित रूप से कुछ सिरदर्द के लिए बना देगा।

संबंधित मुद्दे