从postgresql函数中检索异常消息

时间:2012-08-23 18:38:43

标签: perl postgresql exception-handling dbi catalyst

我在一个表上运行一个触发器函数,在某些情况下会引发异常。

我维护一个在Catalyst上运行的旧Perl应用程序,它创建一个事务并在表上插入行。

当触发器函数引发异常时,我希望能够打印出我抛出的错误消息,而不是任何调试信息(数据库操作,上下文,perl文件等)。

例如,如果我的函数抛出类似的东西:

raise exception 'Item with id % cannot be shipped at this time.', new.id;

我想只看

  

目前无法发货ID为13的物品。

而不是

  

DBIx :: Class :: Row :: insert():DBI异常:DBD :: Pg :: st执行失败:ERROR:此时无法发送ID为13的项目。 [for Statement“INSERT INTO ... at /home/../lib/Class/Controller/Inv.pm line 260

perl代码目前类似于

$c->model('Class')->schema->txn_do(sub {
    ...
    eval {
        $shipment->insert;
        1;
    } or do {
        $error = $@;
        last;
    };

    if ($error) {
        $c->stash->{error} = $error;
    }
);

谢谢。

2 个答案:

答案 0 :(得分:3)

也许这种替代:

my $error = $@;
$error =~ s/^.*ERROR: (.*) \[for Statement.*$/$1/;

答案 1 :(得分:1)

你可以访问数据库句柄的errstr()方法,这就是传递给warn / die的方法

 warn $c->model('Class')->schema->storage->dbh->errstr();