# Within some connect_to_db() function ...
my $dbh = try {
DBI->connect(
$conn_string,
$props{USER},
$props{PWD},
{
PrintError => 0,
RaiseError => 1,
},
)
} otherwise {
throw Error::Database -text => (
$DBI::errstr
|| $@
|| "Unknown Error: '$conn_string'"
);
};
$dbh->{HandleError} = sub { throw Error::Database -text => $DBI::er
+rstr };
return $dbh;
}
# Now, any DB action I take that would ordinarily return undef
# will now throw an Error::Database. As long as all my DB
# activity is within a try-catch area, I'm fine. :-)
# Within another section, I have:
my ($dbh, $fh);
try
{
my ($properties, $datafile) = Parameter::Validate(@ARGV, 2);
$dbh = Database::Connect(File::ReadProperties($properties));
my %db_values = Retrieve_DB_Values($dbh);
$fh = File::Open(
$datafile,
mode => 'w',
);
# Do more stuff here
}
catch Error::Simple with
{
my ($err, $recover) = @_;
throw Error::Unknown -text => $err->text;
}
catch Error with
{
my ($err, $recover) = @_;
die $err->text . $/;
}
otherwise
{
throw Error::Unknown -text => $@;
}
finally
{
Database::Disconnect($dbh);
File::Close($fh);
};
Note that I have wrapped around DBI->connect and IO::File->new, in order to provide consistent error handling.
------ We are the carpenters and bricklayers of the Information Age. Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement. Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified. |