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 のアイテムは現時点で出荷できません。[ステートメント "INSERT INTO ... at /home/../lib/Class/Controller/Inv.pm 行 260 の場合

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 に答える