2009-07-23 2 views
2

Спасибо всем заблаговременно.Ловля ошибок с помощью mod_cgi и mod_perl

Я занимался некоторыми исследованиями в области обработки ошибок, и я не чувствую, что понимаю, что я должен делать.

Преамбула: мой код живет в Apache и выполнен в браузере, мои цели не включают выполнение командной строки.

Я хотел бы иметь поведение CGI :: Carp (fatalsToBrowser) с возможностью захвата вывода и иметь возможность бросать его на мою собственную страницу с шаблонами, отправлять по электронной почте и т. Д. ... Я заметил, что fatalsToBrowser не работает с mod_perl. Кто-нибудь знает, почему? Как Apache/mod_perl мешает?


Первый гол: Я хотел бы поставить что-то вместе, что работает, если код выполняется с mod_perl или mod_cgi.

Вторая цель: Я хотел бы иметь метод высокого уровня, который улавливает все ошибки, похожие на методы .NET Application_Error .NET (в global.asax) и методы set_exception_handler() и PHP set_exception_handler(). Это позволяет вам контролировать ситуацию при возникновении ошибки, без обертывания кода в беспорядочном /брутто операторов try-catch.


Вещи, которые я читал/обзор:

1.) OO Exception Handling in Perl, но не то, что я искал. Большинство вещей, которые я хочу поймать, - die() ing. В следующей ссылке также говорится, что эта статья устарела и устарела.

2.) Perl: $SIG{__DIE__}, eval { } and stack trace, но я не получил многого от этого, связанного с моими целями.

3.) Практический режим Perl (O'Reilly), глава 21 «Обработка ошибок и отладка». К счастью, весь мой код perl использует строгую информацию, и предупреждения включены, и наиболее важные вещи, упомянутые в главе 6 «Кодирование с помощью mod_perl in Mind», уже выполнены.

4.) Я прорыл оглавление в «Изучении Perl», «Perl Cookbook», «Программирование Perl» и «Perl высшего порядка» и не видел ничего, что торчало на меня. Если вы думаете, что я что-то пропустил, пожалуйста, дайте мне знать. :)


Я не помню, где (возможно, в «Практической mod_perl», но я читал, что вы не должны связываться с $ SIG {__ DIE__}.

+0

Являются ли ваши сценарии реальными сценариями mod_perl или вы просто запускаете скрипты CGI в качестве скриптов ModPerl :: Registry для повышения производительности? –

+0

Мои сценарии будут (должны) выполнять то же самое в любой среде. – rakhavan

+0

Думаю, вам стоит пересмотреть свое мнение о блоках try/catch. Они не совсем грязные или грубые, если они используются на правильном уровне. – innaM

ответ

1

Вы читали немного на mod_perl веб-сайта на Alternative Exception Handling Techniques? В нем обсуждается, как вы можете поймать неперехваченные исключения, хотя использование переопределения глобальной функции die() вместо использования $SIG{__DIE__}. Очень чистый метод, но не идеальный.

+0

Спасибо TON! Это было замечательно. – rakhavan

+0

Я рад, что смогу помочь. – Weegee

1

Какие ошибки вы ? пытаясь поймать ли custom error pages не достаточно для ваших целей

Мои CGI скрипты короткие (ОК, это действительно голые кости — и непроверенных):

#!/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

Я разрешаю программисту выбирать, хотят ли они, чтобы стек проистекал в сообщении об ошибке ... очевидно, что в производственной среде мы отключили отображаемую трассировку стека. Тем не менее, я все равно хотел бы иметь доступ к нему, чтобы я мог показать пользователю дружеское сообщение и отправить администратору реальную стеклу или записать ее в db и т. Д. Пожалуйста, посмотрите мою вторую цель в моем OP, я не хочу, чтобы все было обернуто попыткой/уловом ... Мне нужен высокоуровневый ловушка с ошибкой, который может взять у них контроль с соответствующей информацией. – rakhavan

+0

Это выглядит грязно/грубо для вас? – innaM

+0

Да/Нет ... Я думаю, @Weegee дал мне то, что я искал. Мне нужно что-то, что не связано со сценарием (-ами) для глобального захвата ошибок в моих приложениях. Я посмотрю, работает ли это, прежде чем выбирать ответ. Еще раз спасибо за ваши ответы, высоко оценил. – rakhavan