I would like to trap every error added to $c->error() and log it, noting the
caller (filename, line number) in the logs.

I've not gotten Catalyst::Plugin::ErrorCatcher to work, so I wrote my own
plugin that overrides $c->error with the following method:

  use MRO::Compat;
  use namespace::autoclean;

  sub error {
    my ($c, @args) = @_;

    foreach my $arg (@args) {
        if ($arg) {


    return $c->next::method(@args);

But this only logs errors as coming from my plugin.

Using Sub::Uplevel or fiddling with $Log::Dispatch::CallerDepth or
$Catalyst::Plugin::Log::Dispatch::CallerDepth doesn't seem to work.

I also tried writing the plugin as a Moose::Role that adds my trap before
error, but then it claims to be from one of the internal Moose classes in my

I can manually get the caller using caller(0) and add them to the log
messages, but that's a bit clumsy (and overrides log formats that don't
include the information).

So... what is the best practice for trapping errors in a way that preserves
caller information?

List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Reply via email to