2012-03-06 1 views
-2

데이터베이스의 일부 레코드를 업데이트 중입니다. 그리고 모든 처리는 eval 블록에서 수행됩니다. 문제는 레코드가 성공적으로 업데이트 되더라도 예외가 발생하는 것입니다.perl eval throwing blank exception

예외를 디버깅하려면 데이터 덤퍼를 사용하여 인쇄를 시도했지만 예외는 공백입니다.

언제든지이 오류의 원인을 식별하고 왜 때마다 오류가 발생하는지 알 수 있습니까?

환경 정보 (펄 5.8 및 유닉스 SUSE) 데이터 덤퍼에서

덤프 :

$VAR1 = ' 
'; 

I .. 이러한 레코드를 업데이트, 다양한 내부 API를 사용하고 그래서 찾아 내 코드를 수정 유사 :

 sub main{ 
     eval{ 
     DB->updateRecord($value) 
     }; 
     if([email protected]){ 
      Mail->SendMail(__PACKAGE__,[email protected]): 
     } 
     } 

     package DB; 
     sub updateRecord{ 
      my ($self , $value) = @_; 
      my $query = "update set column_value = $value ..<update query> "; 
      API->processQuery($query); 
     } 
+0

상황에 대해 밝힐 수 있도록 여기에 코드를 게시 할 수 있습니까? – CanSpice

+3

몇 가지 코드가 없으면 질문이 내려지고 닫힐 수 있습니다. [faq]와 [ask]를 읽으십시오. –

+2

해당 덤프는 비어 있지 않으며, false/empty로 간주되지 않는 개행 문자를 포함합니다. – TLP

답변

7

코드 use warnings;이 맞습니까?

당신의 코드에서 문자열을 "\n"으로 전달한다는 내용의 증상이 나타납니다. 내 추측은 당신의 오류 메시지로 죽으려고 노력하고 있지만 귀하의 오류 메시지가 초기화되지 않은 귀하의 소스에있을 것입니다. 그것은 뭔가 some_test() 만약

my $error; 
if (some_test()) { 
    $error = 'Some String'; 
} 
if (some_other_test()) { 
    die "$error\n"; 
} 

같은 패스 할 수 있지만, 다이는 새로운 라인을 포함하는 오류를보고합니다 some_other_test() 실패 할 수 있습니다. 또한 경고가 활성화 된 경우 경고를 내 보냅니다.

또 다른 가능성은 오타입니다. use strict;이 아닌 경우 오류 변수가 올바르지 않을 수 있습니다. use strict;이없이

my $error = 'Some String'; 
if ($error) { 
    #note the typo (transposed ro to or) 
    die "$erorr\n"; 
} 

쉬운 실수를 놓칠 수 있습니다.

+0

내부 API를 확인하고 같은 오류가 발생했습니다 .... 감사합니다. –

+0

'eval'은'$ @'을 (를) 실제로 망칠 수 있습니다. (5.14 또는 5.16에서 수정 됨) 당신이 그것을 알고 있고 그것이 다른 오류가 될 가능성이 높고 당신이 옳았다 고 생각한다면, 와우! – ikegami

+0

@ikegami, 증상은'$ @ = "\ n"'Perl의 구덩이 버그는 대개'$ @ = undef'를 남깁니다. 관심있는 논리가 $ \ 누군가에 "\ n"을 얻으려는 줄을 따라 갔다면 아마'죽을 것 '이라고 불렀을 것입니다. \ n ";", 그러나 그들은 아마도 그것을 쓰지 않았습니다. 그렇다면 전형적인 실수는 무엇일까? 그것은 아마도 문자열로 보간 된 초기화되지 않은 값일 것입니다. 어떤 경고가 나오는가? –