2011-03-02 1 views
1

고려 다음 작업 : 이제 당신이 요청하는 경우연쇄 반응에서 촉매가 한 번만 죽는 이유는 무엇입니까?

sub get_stuff :Chained('/') :PathPart('stuff') :CaptureArgs(1) { 
    my ($self,$c,$stuff_id) = @_; 
    die "ARRRRRRGGGG"; 
} 

sub view_stuff :Chained('get_stuff') :PathPart('') :Args(0){ 
    die "DO'H"; 
} 

'/ 재료/314 /', 당신은 단지 처음에 오류가 발생하지 이유가 있나요

Error: ARRRRG in get_stuff at ... 

Error: DO'H in view_stuff at ... 

를 얻을 수 있습니다 실패한 체인 링크?

왜 촉매가 체인을 계속하려고합니까?

답변

2

'이유'에 대한 답변이 확실하지 않지만 융통성을 줄 수 있다고 생각합니다.

처리 작업을 중지하려면 eval (또는 Try::Tiny 또는 TryCatch)과 같은 오류를 catch하고 $c->detach으로 전화해야합니다.

0

쿠커 티브가 맞다. 분리는 갈 길이다. 이유에 관해서는, 일반적으로 perl 프로세스에서 'die'는 프로세스를 중지시킵니다. 촉매제에서는 그것을 원하지 않습니다. 예를 들어 FastCGI에서 Catalyst 응용 프로그램을 실행하면 여러 요청을 처리하는 하나 이상의 독립 실행 형 프로세스가 생성됩니다. 첫 번째 요청이 프로세스 자체를 중지시키는 경우 웹 서버는 다음 호출을 처리 할 수 ​​있도록 FastCGI 프로세스를 다시 생성해야합니다. 나는 Catalyst가 'die'(기본 'do_something() 또는 die $!'로 많이 사용됨)를 catch하여 Exception으로 변환한다고 생각합니다.

'exit'로 프로세스를 종료 할 수도 있지만 위와 동일한 문제가 발생하여 프로세스가 종료됩니다. 할 수있는 일은 기본 로그 객체와 함께 전달 된 오류를 기록한 다음 분리 또는 무언가를 호출하는 자체 '죽을'방법을 만드는 것입니다. 또한 아무것도 촉매를 가능한 한 :)

+0

촉매가 죽을 확률이 많은 층이 있습니다. 연속 된 행동의 평가를 계속하는 것은 분명히 선택입니다. – jeje

1
+0

안녕하세요. 어쩌면 당신이 제공 한 링크에서 몇 가지 설명을 추가해야합니다, 당신의 대답은 링크가 끊어지면 쓸모 없을 것입니다. 답변에 적절한 정보를 복사하여 복사 할 수도 있습니다. "편집"을 사용하여 더 많은 정보를 추가 할 수 있습니다. FAQ : http://stackoverflow.com/faq도 참조하십시오. – ForceMagic

1

선택된 답은 구형 일 수있는 촉매 예외 처리를 재정의 할 수 있어야한다. Catalyst는 응용 프로그램의 구성 키 abort_chain_on_error_fix이 설정되면 일찍 종료 될 수 있습니다.

__PACKAGE__->config(abort_chain_on_error_fix => 1); 

Catalyst configurations에 대한 설명서를 참조하십시오. 또한이 행동은 미래에 표준이 될 수 있다고 말합니다.