2017-04-05 1 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 

공지 펄 6가 실제로 무엇을보고 이외의 특정 문제를 해결하기 위해 노력하고 있지 않다. 그러나, 나는 그것에 관해 정말로 묻지 않고있다.

여기 그림의 흐름이 궁금합니다. 나는 하위의 CONTROL이 예외를 잡아서 다시 시작하기를 기대 했으므로 try까지 퍼콜하지 않을 것입니다. 그 흐름은 어떻게해야합니까?

또한 예외는 CX::Warn입니다. 나는 이상한 뭔가 일을했다고 생각하지 않지만, Perl 6 types이조차 목록 할 X::Warn

+0

'CX ::'네임 스페이스 전체가 해당 페이지에 문서화되어 있지 않습니다 ... – 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.d에서, 아마도 await)도 처리기로 처리 할 수 ​​있습니다. 이는 꽤 골치 아픈 문제입니다.

관련 문제