#17 error handling
2011-12-17
Tengではエラーハンドリングを利用者が独自に定義することが可能です。
たとえばデフォルトの挙動として
$teng->search_by_sql('* FROM user WHERE id = ?', [1]);
このように誤ったSQLを実行してしまった時などは
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@ Teng 's Exception @@@@@
Reason : DBD::SQLite::db prepare failed: near "*": syntax error at ....
SQL : * FROM user WHERE id = ?
BIND : $VAR1 = [
1
];
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
at ....
といったエラーメッセージがcroakされます。
この処理はTeng#handle_errorメソッドでおこなっているので、
Tengを継承しているクラスでオーバーライドすることが可能です。
たとえばTengで表示されるエラーメッセージがうるさい場合なんかは
package Proj::DB;
use strict;
use warnings;
use parent 'Teng';
sub handle_error {
my ($self, $stmt, $bind, $reason) = @_;
$reason =~ s/\r?\n//;
require Data::Dumper;
local $Data::Dumper::Indent = 0;
local $Data::Dumper::Terse = 1;
local $Data::Dumper::Useqq = 1;
local $Data::Dumper::Pair = '=>';
Carp::croak sprintf '%s %s %s', $reason, $stmt, Data::Dumper::Dumper($bind);
}
1;
このようにすることで
DBD::SQLite::db prepare failed: near "*": syntax error at /Users/kobayashi.atsushi/perl5/perlbrew/perls/perl-5.12.1/lib/site_perl/5.12.1/Teng.pm line 206. * FROM user WHERE id = ? [1] at ...
と、1行で収めることも可能です。
明日はPluginについて紹介したいと思います