[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