diff --git a/Bugzilla.pm b/Bugzilla.pm index 95089283d..8482cd54a 100644 --- a/Bugzilla.pm +++ b/Bugzilla.pm @@ -71,11 +71,6 @@ BEGIN if ($msg !~ /^(Программа вызвала сброс соединения|Software caused connection abort) at /iso) { $msg = { eval_error => $msg }; - if (eval { require Devel::StackTrace; }) - { - # Append stack trace if Devel::StackTrace is available - $msg->{stack_trace} = Devel::StackTrace->new->as_string; - } Bugzilla::Error::ThrowCodeError('eval_error', $msg); } } diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm index 8e70e3571..87332883c 100644 --- a/Bugzilla/Error.pm +++ b/Bugzilla/Error.pm @@ -38,6 +38,8 @@ use Data::Dumper; use overload '""' => sub { $_[0]->{message} }; +my $HAVE_DEVEL_STACKTRACE = eval { require Devel::StackTrace }; + # We cannot use $^S to detect if we are in an eval(), because mod_perl # already eval'uates everything, so $^S = 1 in all cases under mod_perl! sub _in_eval { @@ -77,6 +79,11 @@ sub _throw_error $vars ||= {}; $vars->{error} = $error; + if (!$vars->{stack_trace} && $HAVE_DEVEL_STACKTRACE) + { + # Append stack trace if Devel::StackTrace is available + $vars->{stack_trace} = Devel::StackTrace->new->as_string; + } my $mode = Bugzilla->error_mode; # Make sure any transaction is rolled back (if supported).