2017-04-05 7 views
5

私はPerl 6の制御例外を使いこなしています。 warnは、通常の例外制御フローには見えない制御例外を発生させ、その例外自体が再開します。それはちょっと涼しいです。Perl 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"; 
    } 

それは両方の火のようになります:Moarパニック、I've raise an issue forがあります

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 

お知らせ私は、Perl 6が実際に何をするか見て以外の特定の問題を解決しようとしていませんよ。しかし、私はそれについて本当に尋ねていません。

私はここで流れの絵が好きです。私はサブのCONTROLが例外を捕捉して再開することを期待していたので、tryまでは浸透しませんでした。どのように流れなければなりませんか?

また、例外はCX::Warnです。 、CATCHと同様に(例外をキャッチし、両方の私はそこに奇妙な何かをやったとは思いませんが、Perl 6 typesは、デフォルトの警告ハンドラと同じ動作を取得するにはいなくても、リストX::Warn

+0

'CX ::'名前空間全体がそのページに記載されていないことに注意してください... – Christoph

+1

不足しているドキュメントについては、https://github.com/perl6/docに問題を追加してください。ありがとうございました! –

+0

文書の問題:https://github.com/perl6/doc/issues/1268 –

答えて

5

を行い、それはする必要がありますスマートマッチングのない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を使用するのが賢明です。そうでなければ、takenextlastemitdone(そして、6.dではおそらくawait)もハンドラで網羅することができます。

関連する問題