# NAME Catalyst::Plugin::ErrorCatcher - Catch application errors and emit them somewhere # VERSION version 0.0.8.16 # SYNOPSIS use Catalyst qw/-Debug StackTrace ErrorCatcher/; # DESCRIPTION This plugin allows you to do More Stuff with the information that would normally only be seen on the Catalyst Error Screen courtesy of the [Catalyst::Plugin::StackTrace](https://metacpan.org/pod/Catalyst::Plugin::StackTrace) plugin. ## setup($c, $@) Prepare the plugin for use. ## finalize\_error($c) If configured, and needed, deal with raised errors. ## my\_finalize\_error($c) This is the method that's called by `finalize_error` when we do want to use ErrorCatcher to format and emit some information. ## emitters\_init($c) This routine initialises the emitters enabled in the configuration for the plugin. ## append\_feedback($stringref, $data) This is a small utility method that simplifies some of the work needed to add some data to a string-reference, including some basic checks and initialisation. ## append\_feedback\_emptyline Add an empty-line to the string-reference of data being built. ## append\_feedback\_keyvalue($ref, $key, $value, $keypadding) Add: {key}: value to the feedback data being prepared. `$keypadding` is optional. If omitted, defaults to 8. ## sanitise\_param($value) Local implementation of ["qquote" in Data::Dumper](https://metacpan.org/pod/Data::Dumper#qquote) and general sanity checks and transformations of the data in a given piece of data. ## append\_output\_params($ref, $label, $params) Given a hashref of related items, `$params`, and a `$label` for the grouping, add sensibly formatted output to the feedback data being constructed. # CONFIGURATION The plugin is configured in a similar manner to other Catalyst plugins: enable 1 context 5 always_log 0 include_session 0 user_identified_by username emit_module A::Module - **enable** Setting this to _true_ forces the module to work its voodoo. It's also enabled if the value is unset and you're running Catalyst in debug-mode. - **context** When there is stack-trace information to share, how many lines of context to show around the line that caused the error. - **emit\_module** This specifies which module to use for custom output behaviour. You can chain multiple modules by specifying a line in the config for each module you'd like used: emit_module A::Module emit_module Another::Module emit_module Yet::Another::Module If none are specified, or all that are specified fail, the default behaviour is to log the prepared message at the INFO level via `$c->log()`. For details on how to implement a custom emitter see ["CUSTOM EMIT CLASSES"](#custom-emit-classes) in this documentation. - **always\_log** The default plugin behaviour when using one or more emitter modules is to suppress the _info_ log message if one or more of them succeeded. If you wish to log the information, via `$c->log()` then set this value to 1. - **include\_session** The default behaviour is to suppress potentially sensitive and revealing session-data in the error report. If you feel that this information is useful in your investigations set the value to _true_. When set to 1 the report will include a `Data::Dump::pp()` representation of the request's session. - **user\_identified\_by** If there's a logged-in user use the specified value as the method to identify the user. If the specified value is invalid the module defaults to using _id_. If unspecified the value defaults to _id_. # STACKTRACE IN REPORTS WHEN NOT RUNNING IN DEBUG MODE It is possible to run your application in non-Debug mode, and still have errors reported with a stack-trace. Include the StackTrace and ErrorCatcher plugins in MyApp.pm: use Catalyst qw< ErrorCatcher StackTrace >; Set up your `myapp.conf` to include the following: enable 1 enable 1 # include other options here Any exceptions should now show your user the _"Please come back later"_ screen whilst still capturing and emitting a report with stack-trace. # PROVIDED EMIT CLASSES ## Catalyst::Plugin::ErrorCatcher::Email This module uses [MIME::Lite](https://metacpan.org/pod/MIME::Lite) to send the prepared output to a specified email address. See [Catalyst::Plugin::ErrorCatcher::Email](https://metacpan.org/pod/Catalyst::Plugin::ErrorCatcher::Email) for usage and configuration details. # CUSTOM EMIT CLASSES A custom emit class takes the following format: package A::Module; # vim: ts=8 sts=4 et sw=4 sr sta use strict; use warnings; sub emit { my ($class, $c, $output) = @_; $c->log->info( 'IGNORING OUTPUT FROM Catalyst::Plugin::ErrorCatcher' ); return; } 1; __END__ The only requirement is that you have a sub called `emit`. `Catalyst::Plugin::ErrorCatcher` passes the following parameters in the call to `emit()`: - **$class** The package name - **$c** A [Context](https://metacpan.org/pod/Catalyst::Manual::Intro#Context) object - **$output** The processed output from `Catalyst::Plugin::ErrorCatcher` If you want to use the original error message you should use: my @error = @{ $c->error }; You may use and abuse any Catalyst methods, or other Perl modules as you see fit. # KNOWN ISSUES - BODY tests failing (Catalyst >=5.90008) Summary: https://github.com/chiselwright/catalyst-plugin-errorcatcher/pull/1 Bug report: https://rt.cpan.org/Public/Bug/Display.html?id=75607 # SEE ALSO [Catalyst](https://metacpan.org/pod/Catalyst), [Catalyst::Plugin::StackTrace](https://metacpan.org/pod/Catalyst::Plugin::StackTrace) # THANKS The authors of [Catalyst::Plugin::StackTrace](https://metacpan.org/pod/Catalyst::Plugin::StackTrace), from which a lot of code was used. Ash Berlin for guiding me in the right direction after a known hacky first implementation. # CONTRIBUTORS Fitz Elliot [https://github.com/felliott/](https://github.com/felliott/) # AUTHOR Chisel # COPYRIGHT AND LICENSE This software is copyright (c) 2015 by Chisel Wright. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.