2012-09-17 2 views
2

나는 try-catch에 Try::Tiny을 사용하고 있습니다.시도해보십시오 :: 초소형 : try-catch 또는 Not를 사용하는 이상한 동작?

코드는 다음과 같이 간다 : 나는 을 실행하면

use Try::Tiny; 

try { 
    print "In try"; 
    wrongsubroutine(); # undefined subroutine 
} 
catch { 
    print "In catch"; 
} 

somefunction(); 

...

sub somefunction { 
    print "somefunction"; 
} 

그것은 다음과 같이 제공 :

somefunction 
In Try 
In catch 

출력 순서가 나에게 잘못 보인다. 잘못 됐나? 또는이 정상적인 동작입니까?

+0

시도 부분이 평가되므로 무언가가 잘못되었을 때 "죽습니다."그러면 $ @가 유효하기 때문에 catch 블록에 도달하게됩니다. – snoofkin

답변

15

다만

print 
somefunction(); 

에 세미콜론 잊고 같이 somefunction 대신 $_, 누락 세미콜론 somefunction의 출력을 일으키는의 print에 전달되는 출력이 인수로서 전달되는 원인 catch.

try { 
    ... 
} 
catch { 
    ... 
};  <--------- missing 
somefunction(); 

trycatch&@ 프로토 타입과 서브 루틴이다. 즉

try { ... } LIST 
catch { ... } LIST 

그래서 코드를 당신이 볼 수 있듯이

&try(sub { ... }, &catch(sub { ... }, somefunction())); 

과 동일

&try(sub { ... }, LIST) 
&catch(sub { ... }, LIST) 

과 동일의 catch 블록 후 누락 된 세미콜론이 원인이되는 의미 somefunctioncatch 전에 호출해야합니다 (이는 예외로 수행 할 작업을 try에게 알려주는 객체를 반환 함) 및 try입니다.

코드는 시도 - 캐치 콜 이후에 세미콜론을 배치함으로써 달성된다

&try(sub { ... }, &catch(sub { ... })); somefunction(); 

해야한다.

+0

감사합니다. 정말 도움이되었습니다. 나는 catch 블록 이후에'; '가 필요하다는 것을 몰랐다. +1. –

+0

여기 호기심이 있습니까? 왜 그것은 세미콜론이 누락되었다는 구문 오류를 발생시키지 않거나 제기하지 않았습니다. –

+0

@Drt,'print somefunction();을 추천하고 싶습니다.'print; somefunction();'? 왜 이것이 완벽하게 합법적 인 구문인지 자세히 설명했습니다. – ikegami

2

어떤 순서로 하시겠습니까? 코드가 catch 코드 뒤에 세미콜론을 정말로 놓치고 있습니까?

+0

당신이 옳은 것처럼 보입니다.'somefunction()'은 세미콜론이 생략 된 경우'catch {...}'(별도의 명령문이 아님)의 마지막 인수가됩니다. – Dallaylaen

+0

+1 감사합니다. @ 코로나. –

관련 문제