my $retval = eval { $sth->execute(@values); }; unless ($retval) { _db_recover(); } ... sub _db_recover { eval { $dbh->disconnect(); }; warn("reconnecting to database in 20 seconds\n"); sleep 20; eval { $dbh->connect(@somevalues); }; }