Schrift
[thread]9066[/thread]

Manipulierung von __DIE__ und __WARN__

Leser: 2


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
bloonix
 2007-06-05 13:45
#77247 #77247
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ich möchte gerne eure Bedenken wissen, was alles gegen

Code: (dl )
1
2
$SIG{__DIE__}  = sub { $log->error(@_) && exit(9) };
$SIG{__WARN__} = sub { $log->warn(@_) };


spricht.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Strat
 2007-06-05 14:21
#77248 #77248
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
eigentlich nichts; nur sollte man auch direkt auf STDERR (oder STDOUT) mitbekommen, wenn ein programm stirbt, und nicht erst aus einer Logdatei.

Ich verwende im Warn- oder Die-handler gerne auch eine Art Backtrace, damit ich leichter feststellen kann, worueber die aktuelle Warnung entstanden ist, z.B.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub DieHandler {
print STDERR "Died: @_\n\n";

print STDERR "Backtrace:\n\n";
my $count = 0;
while( $count > -1 ) {
my ($package, $filename, $line, $sub) = caller($count);
last unless defined $line;
printf STDERR "%02i %5i %-50s %-20s\n", $count++, $line, $sub, $filename;
} # while

die "\nDied\n";
} # DieHandler

oder so aehnlich
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sid burn
 2007-06-05 14:32
#77249 #77249
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@Strat
Gibt es einen speziellen grund warum du nicht gleich "confess" oder "cluck" aus dem Modul Carp nutzt, anstatt selber mit caller() durchzugehen?
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
bloonix
 2007-06-05 17:41
#77250 #77250
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Strat,05.06.2007, 12:21]eigentlich nichts; nur sollte man auch direkt auf STDERR (oder STDOUT) mitbekommen, wenn ein programm stirbt, und nicht erst aus einer Logdatei.[/quote]
Hallo Strat,

mein Hintergrund ist folgender:

Wenn zum Beispiel ein Skript via Cron gestartet wird, dann möchte ich
nicht, dass die Meldung in die lokale Mailbox wandert, sondern ins Logfile,
also dorthin, wo sie sinngemäß hingehört.

Aus diesem Grund habe ich auch

Code: (dl )
$log->error(@_) && exit(9)

geschrieben. Falls das Loggen des Fehlers in die Logdatei aus irgendeinem
Grund nicht funktioniert, dann wird exit() nicht ausgeführt und die Meldung
wird auf STDERR auf jeden Fall ausgegeben. Natürlich kann man sich noch
andere Konstrukte ausdenken und die Subroutine anders gestalten, zum
Beispiel:

Code: (dl )
$SIG{__DIE__} = sub { print STDERR @_; $log->error(@_); exit(9) }

Mir ging es primär um die Manipulierung von __DIE__ und __WARN__. In der
perldoc steht, dass dies nicht gern gesehen wird, deshalb wollte ich mir
noch einmal ein paar Meinungen einholen. =)

Es ist aber schön zu lesen, dass du darin kein Problem siehst.

Gruss,
opi\n\n

<!--EDIT|opi|1181050923-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-06-05 17:44
#77251 #77251
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Strat,05.06.2007, 12:21]Ich verwende im Warn- oder Die-handler gerne auch eine Art Backtrace, damit ich leichter feststellen kann, worueber die aktuelle Warnung entstanden ist, z.B.[/quote]
du hast mich auf eine Idee gebracht! eine methode, die caller
informationen raushaut, wenn sie aufgerufen wird... merci :)

bislang wurden die nur geschrieben, wenn der debugger aktiviert wurde...\n\n

<!--EDIT|opi|1181051132-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Strat
 2007-06-05 19:56
#77252 #77252
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=sid burn,05.06.2007, 12:32]@Strat
Gibt es einen speziellen grund warum du nicht gleich "confess" oder "cluck" aus dem Modul Carp nutzt, anstatt selber mit caller() durchzugehen?[/quote]
Fuer den geposteten codeschnipsel waere es in der Tat sinnvoller. Ich habe da meistens nur einiges mehr an Code, was ich damit nicht abdecken koennte.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
bloonix
 2007-06-06 01:25
#77253 #77253
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Strat,05.06.2007, 17:56]Ich habe da meistens nur einiges mehr an Code, was ich damit nicht abdecken koennte.[/quote]
Wie meinst du das? Zuviel Code, den du anpassen müsstest?
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Strat
 2007-06-06 03:18
#77254 #77254
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein, weitere debug-informationen, die ich manchmal beschaffe; und da brauche ich z.B. Dateinamen und Zeilennummer in variablen, da hilft mir confess oder so nicht...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
bloonix
 2007-06-06 10:59
#77255 #77255
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Strat,06.06.2007, 01:18]nein, weitere debug-informationen, die ich manchmal beschaffe; und da brauche ich z.B. Dateinamen und Zeilennummer in variablen, da hilft mir confess oder so nicht...[/quote]
wie wäre es mit

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
use strict;
use warnings;
use Log::Handler;

my $log = Log::Handler->new(
  filename => \*STDERR,
  newline => 1
);

$SIG{__DIE__} = sub { $log->trace(@_); exit(9); };

die "here we die";


Ausgabe:

Code: (dl )
1
2
3
4
5
6
# ./foo.pl 
Jun 06 08:57:05 [TRACE] here we die at ./foo.pl line 13.
  CALL(3): package(main) filename(./foo.pl) line(13) subroutine(main::__ANON__) hasargs(1) wantarray(0)
  CALL(2): package(main) filename(./foo.pl) line(11) subroutine(Log::Handler::trace) hasargs(1)
  CALL(1): package(Log::Handler) filename(/usr/local/share/perl/5.8.8/Log/Handler.pm) line(959) subroutine(Log::Handler::_print) hasargs(1)
  CALL(0): package(Log::Handler) filename(/usr/local/share/perl/5.8.8/Log/Handler.pm) line(1110) subroutine(Devel::Backtrace::new) hasargs(1) wantarray(0)


oder mit debug_mode => 2

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Jun 06 08:59:54 [TRACE] here we die at ./foo.pl line 14.
  CALL(3):
     package     main
     filename    ./foo.pl
     line        14
     subroutine  main::__ANON__
     hasargs     1
     wantarray   0
  CALL(2):
     package     main
     filename    ./foo.pl
     line        12
     subroutine  Log::Handler::trace
     hasargs     1
  CALL(1):
     package     Log::Handler
     filename    /usr/local/share/perl/5.8.8/Log/Handler.pm
     line        959
     subroutine  Log::Handler::_print
     hasargs     1
  CALL(0):
     package     Log::Handler
     filename    /usr/local/share/perl/5.8.8/Log/Handler.pm
     line        1110
     subroutine  Devel::Backtrace::new
     hasargs     1
     wantarray   0
\n\n

<!--EDIT|opi|1181113264-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
Strat
 2007-06-06 13:11
#77256 #77256
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
gefaellt mir sehr gut und ist in vielen Situationen sehr hilfreich.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2007-06-05 13:45.