Perlでも、eavl〜if($@)を使用して、気持ちTry〜catch的なことができるのですね。
use DBI;
use Encode;
# データベース接続情報を設定
$dbname = "maomao_db";
$host = "localhost";
$user = "maomao";
$password = "maomao";
# データベースへの接続。ここで、PgPP という名前の DBD を指定しています。
$conn = DBI->connect("dbi:PgPP:dbname=$dbname;host=$host", $user, $password) or die;
#オートコミットをオフにします。
$conn->{AutoCommit} = 0;
#エラーメッセージの自動表示を抑止します。
$conn->{PrintError} = 0;
$sql = "INSERT INTO department(id, name) VALUES (?, ?);";
# SQL の発行
$sth = $conn->prepare($sql);
#トランザクション制御のためevalでdieをトラップします。
eval {
#RaiseErrorに"1"を設定することで、エラー発生時に自動的にdieするようになります。
#→自動的に実行されるdieは次の通り die("$class $method failed $DBI::errstr")
$sth->{RaiseError} = 1;
$sth->execute(7, "BBB");
$sth->execute(8, "AAA");
};
if ($@) {
#・rollbackをすると、"$@"の内容がクリアされてしまうので、順番に注意
#・DBのエンコーディングはUTF8のため(?)、エラーメッセージはUTF8になります。
# ここでは、DOSプロンプトで実行しているためShift-JISに変換しています。
warn "Transaction aborted because". encode('shift-jis', decode('utf-8', $@ ."\n"));
$conn->rollback;
} else {
print "SUCCESS: insert.\n";
$conn->commit;
}
$sth->finish;
$conn->disconnect;
こちらにも書いています(Perlあれこれ)。