[Catalyst] Graceful handling of database failure

J. Shirley jshirley at gmail.com
Tue Jun 17 23:27:58 BST 2008


On Tue, Jun 17, 2008 at 2:31 PM, Mitchell K. Jackson
<mitchell.k.jackson at gmail.com> wrote:
> Good afternoon,
>
> Is there a graceful way for a catalyst app to handle when the database
> server goes away?  If this happens while a process is holding open a
> database connection it's already been using, there's not even a
> database error to the log. The only error is "read data timeout in 40
> seconds", and an error 500 to the web browser.
>
> I would like my app to be able to deliver a  more useful error to the
> end user, such as "Lost database connection."  If I can retain control
> of the app in this event, I'll have it send me an sms for good
> measure.  Any ideas how I could go about this?
>
> Regards,
>
> /Mitchell K. Jackson
>


That's really up to the model you are using.  Catalyst doesn't handle
databases :)

If you are using DBIx::Class, I'd be surprised if it doesn't do the
right thing already.

As far as catching the error, make sure that your model throws a
proper exception and you can catch that in the end action.

Something like this is what I tend to use:

sub render_end : Private ActionClass('RenderView') { }

sub end : Private {
   my ( $self, $c ) = @_;
   $c->forward('render_end');
   if ( @{$c->error} ) {
      # Handle errors
   }
}

In our apps, if we're not running under debug I bake an email and send
it off to Catalyst::View::Email.  I then will set
$c->stash->{template} to something like 'errors/500.tt' and then
re-call the forward to render_end.

-J



More information about the Catalyst mailing list