2012-08-23 2 views
2

특정 상황에서 예외가 발생하는 삽입에 실행되는 테이블에 트리거 기능이 있습니다.postgresql 함수에서 예외 메시지 검색

나는 트랜잭션을 생성하고 테이블에 행을 삽입하는 Catalyst에서 실행되는 오래된 Perl 응용 프로그램을 유지 관리합니다.

트리거 기능을 통해 예외가 발생하면 던져 버린 오류 메시지 만 표시하고 디버깅 정보 (데이터베이스 작업, 컨텍스트, perl 파일 등)는 인쇄 할 수 없도록하려고합니다. 내 기능과 같이 발생하는 경우

그래서 예를 들어, :

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

을 난 단지 펄 코드는 현재 뭔가

Item with id 13 cannot be shipped at this time.

하지

DBIx::Class::Row::insert(): DBI Exception: DBD::Pg::st execute failed: ERROR: Item with id 13 cannot be shipped at this time. [for Statement "INSERT INTO ... at /home/../lib/Class/Controller/Inv.pm line 260

를보고 싶다 like

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

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

감사합니다.

답변

3

아마도이 대체 :

my $error = [email protected]; 
$error =~ s/^.*ERROR: (.*) \[for Statement.*$/$1/; 
+0

네 다이. 정규식을 사용하는 것에 대해 생각한 것입니다. 더 많이 있었을지도 모른다라고 생각해라. .. 나는 그것을하는 적당한 '방법을 추측한다. – rhyek

1

당신은 경고 전달되는 무엇 인 데이터베이스 핸들의 errstr을() 메소드에 액세스 할 수 있습니다/어쨌든

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