2

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

我维护一个在 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 执行失败:错误:ID 为 13 的项目此时无法发货。[对于 /home/../lib/Class/Controller/Inv.pm 第 260 行的语句“INSERT INTO ...

perl 代码目前类似于

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

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

谢谢你。

4

2 回答 2

3

也许这个替换:

my $error = $@;
$error =~ s/^.*ERROR: (.*) \[for Statement.*$/$1/;
于 2012-08-23T18:49:57.097 回答
1

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

 warn $c->model('Class')->schema->storage->dbh->errstr();
于 2012-08-25T05:50:12.963 回答