2009-07-23 4 views
2

미리 감사드립니다.mod_cgi와 mod_perl 모두에서 오류 잡기

나는 오류 처리에 관한 연구를 해왔고, 내가해야 할 일에 대한 확실한 이해를 얻지 못하고있다.

프리앰블 : 내 코드가 아파치에서 살고 있으며 브라우저에서 실행되었으므로 내 목표에 명령 줄 실행이 포함되지 않습니다.

CGI :: Carp (fatalsToBrowser)의 동작을 출력물을 캡처하여 내 자신의 템플릿 페이지에 던져 버릴 수있는 기능으로 만들고 싶습니다. 이메일을 보내면 ... 그 fatalsToBrowser mod_perl에서 작동하지 않습니다. 아무도 이유를 아나요? Apache/mod_perl은 어떻게 진행되고 있습니까?


첫 번째 목표 : 코드가 mod_perl 또는 mod_cgi로 실행되는 경우 작동하도록 함께 정리하고 싶습니다.

두 번째 목표 : .NET의 Application_Error (global.asax) 및 PHP의 set_exception_handler() 및 set_error_handler() 메서드와 비슷한 모든 오류를 catch하는 고급 메서드가 필요합니다. 이것들은 엉망인 /총 try-catch 문에 코드를 래핑하지 않고 오류가 발생할 때 제어 할 수있게합니다.


것 I 검토/읽었습니다 :

1) OO Exception Handling in Perl하지만, 내가 찾고 하였다없는 것. 내가 잡으려고하는 대부분의 것들은 죽는다. 다음 링크에서는이 기사가 최신이 아니며 더 이상 사용되지 않는다고 말합니다.

2.) Perl: $SIG{__DIE__}, eval { } and stack trace 그러나 나는 내 목표와 관련하여 많은 것을 얻지 못했습니다.

3) 실용 모드 Perl (O'Reilly), 제 21 장 "오류 처리 및 디버깅". 고맙게도 모든 필자의 perl 코드는 엄격한 경고와 경고를 사용하며, 6 장 "마음에 mod_perl로 코딩하기"에서 언급 된 가장 중요한 것들은 이미 완료되었습니다.

4.) "Perl 배우기", "Perl Cookbook", "Programming Perl"및 "Higher Order Perl"의 목차를 파헤 치며 나에게 얽힌 것을 보지 못했습니다. 내가 뭔가를 놓친 것 같으면 저에게 알려주세요. :)


나는 곳 (아마도 "실용 mod_perl을"의 기억하지 않지만, 내가 읽은 당신은 오류의 유형을 $ SIG {__ DIE__}.

+0

스크립트가 실제'mod_perl' 스크립트입니까 아니면 CGI 스크립트를 성능 이점을위한'ModPerl :: Registry' 스크립트로 실행하고 있습니까? –

+0

내 스크립트는 어느 환경에서도 동일한 작업을 수행해야합니다. – rakhavan

+0

try/catch 블록에 대한 의견을 다시 평가해야한다고 생각합니다. 올바른 수준에서 사용된다면 지저분하거나 총체적이지 않습니다. – innaM

답변

1

당신이 Alternative Exception Handling Techniquesmod_perl 웹 사이트의 비트를 읽고 : 그래서, 예를 들어 열리고 구성 파일을 읽고 일상에, 당신은 뭔가를해야합니까? $SIG{__DIE__} 대신 global die() 함수를 재정의하는 방법을 사용하여 catch되지 않는 예외를 잡는 방법에 대해 설명합니다. 훨씬 깨끗한 방법이지만 완벽하지는 않습니다.

+0

감사합니다. 그것은 훌륭한 읽을 거리였습니다. – rakhavan

+0

내가 도울 수있어서 기쁩니다. – Weegee

1

하지 엉망해야 ? 잡으려고 노력 당신의 목적을 위해 custom error pages 충분하지

내 CGI 스크립트입니다 (OK,이 정말 베어 뼈 — 및 안된입니다) 짧은 :

#!/usr/bin/perl 

use strict; 
use warnings; 

use My::App; 
use My::ErrorReporter qw(error_to_html); 

run(); 

sub run { 
    my $app = eval { 
     My::App->new(
      'some_param', 
      'another_param', 
     ) 
    }; 

    unless ($app) { 
     print error_to_html([email protected]); 
     return; 
    } 

    eval { 
     $app->handle_request;   
    } and return; 

    print error_to_html([email protected]); 
    return; 
} 

__END__ 

이제 fatalsToBrowser은 사용자에게 적합하지 않습니다. 그것은 당신을위한 개발 원조입니다. 사용자가 보는 오류 메시지는 프로그램에 대한 정보를 전달해서는 안됩니다.

sub read_my_config { 
    my $self = shift; 

    open my $config_h, '<', $self->config_file; 

    unless ($config_h) { 
     # This goes to the Apache error log where you can read it 
     warn sprintf(
      "Cannot open '%s': %s", 
      $self->config_file, $! 
     ); 
     # This is for web site visitors to see 
     die "Cannot open configuration file"; 
    } 

    # rest of the code 
} 
+0

프로그래머는 오류 메시지에 표시된 스택 추적을 원한다면 선택할 수 있습니다. 분명히 프로덕션 환경에서는 표시된 스택 추적을 해제 할 것입니다. 그러나 나는 여전히 사용자에게 친숙한 메시지를 보여줄 수 있고 관리자에게 실제 stacktrace를 이메일로 보내거나 DB 등에 로그 할 수 있도록 액세스 권한을 갖고 싶습니다. 내 OP에서 내 두 번째 목표를 참조하십시오. 모든 것을 try/catch로 감싸고 싶습니다. 적절한 정보를 가지고 제어 할 수있는 상위 수준의 오류 포수가 필요합니다. – rakhavan

+0

너는보기가 지저분합니까? – innaM

+0

예/아니오 ... @ 위지가 내가 원하는 것을 나에게 주었다고 생각합니다. 내 응용 프로그램에서 전역 오류 트래핑을 위해 스크립트에 연결되지 않은 것이 필요합니다. 나는 대답을 선택하기 전에 그것이 효과가 있는지 알게 될 것입니다. 답장을 보내 주셔서 다시 한 번 감사드립니다. – rakhavan