Line # Revision Author
1 8 ahitrov@rambler.ru ##############################################################################
2 # Перегрузка builtin функций 'warn' и 'die'.
3 # Использование:
4 # use Contenido::Errors qw(die warn);
5 # При включенной опции STACK_TRACE = YES ($state->{stack_trace} в config.mk
6 # инсталляции дополняет выводимые сообщения трейсом по компонентам и модулям.
7 ##############################################################################
8 package Contenido::Errors;
9
10 use strict;
11 use warnings 'all';
12 use base qw(Exporter);
13 use vars qw(@EXPORT_OK);
14
15 use Contenido::Globals;
16
17
18 @EXPORT_OK = qw(&debug &die &warn);
19
20 my %skip_pack = map {$_=>1} qw(
21 HTML::Mason::ApacheHandler
22 HTML::Mason::Component
23 HTML::Mason::Request
24 HTML::Mason::Request::ApacheHandler
25 );
26
27 my %skip_file = map {$_=>1} qw(
28 /dev/null
29 );
30
31 sub debug {
32 return unless $DEBUG;
33 warn("DEBUG: ".join("\n", @_));
34 }
35
36 sub warn {
37 my $msg = (@_ ? join("\n", @_) : 'Warning: something\'s wrong').&native(@_);
38 $msg .= &trace if $state->{stack_trace};
39 CORE::warn $msg;
40 }
41
42 sub die {
43 my $msg = (@_ ? join("\n", @_) : 'Died').&native(@_);
44 $msg .= &trace if $state->{stack_trace};
45 CORE::die $msg;
46 }
47
48 sub native {
49 return '' if ($_[-1]||'')=~/\n$/;
50 my @info = caller(1);
51 " at ".$info[1]." line ".$info[2].", in PID $$, ".(localtime(time))."\n";
52 }
53
54 sub trace {
55 my (@stack, @info, $level);
56
57 while (@info = caller(++$level)) {
58 next if $skip_pack{$info[0]} || $skip_file{$info[1]};
59 push @stack, sprintf(' line: %6d file: %s', $info[2], $info[1]);
60 }
61
62 @stack ? "Stack trace:\n".join("\n", @stack)."\n" : '';
63 }
64
65 1;