Thread Net::DNS::Resolver::Base - Problem mit IO::Socket::Inet6 (24 answers)
Opened by dude at 2009-03-20 11:59

Gast dude
 2009-03-20 13:49
#119618 #119618
Hilft leider auch nichts, es tritt immer noch der Fehler auf.
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use CGI::Carp qw(set_die_handler);
BEGIN {
    sub handle_errors {
        return if $^S;

        my $msg = shift;        
        print CGI::header();
        print 'Software error:<br/>';
        print $msg;

        # send mail
        use Mail::Sendmail;
        # ...........
        }

    }
    set_die_handler(\&handle_errors);
}

Was ich auch merkwürdig finde, dass $^S nicht einmal in CGI::Carp auftaucht, nichtmal bei fatalsToBrowser. Allerdings erkenne ich da eine Textfunktion auf eval (bei CGI::Carp::die - zeile 425 - 458):
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
  if ( ineval() )  {
    if (!ref($arg)) {
      $arg = join("",($arg,@rest)) || "Died";
      my($file,$line,$id) = id(1);
      $arg .= " at $file line $line.\n" unless $arg=~/\n$/;
      realdie($arg);
    }
    else {
      realdie($arg,@rest);
    }
  }


ineval sieht so aus:
Code (perl): (dl )
1
2
3
sub ineval {
  (exists $ENV{MOD_PERL} ? 0 : $^S) || _longmess() =~ /eval [\{\']/m
}


Die Lösung für das Problem ist dann dieses:
Code (perl): (dl )
$main::SIG{__DIE__} = $handler;

wird zu
Code (perl): (dl )
1
2
3
4
5
$main::SIG{__DIE__} = sub {
    if( !ineval() ) {
        $handler->();
    }
};
in CGI::Carp::set_die_handler


Kann man das so lassen oder ist das gegen irgendwelche Richtlinien?

View full thread Net::DNS::Resolver::Base - Problem mit IO::Socket::Inet6