[Rio-pm] erro esquisitissimo com eval

Eden Cardim edencardim em gmail.com
Terça Setembro 21 16:09:39 PDT 2010


2010/9/21 Tiago Peczenyj <tiago.peczenyj em gmail.com>:
> segue codigo exemplo...
> use English;
> ...
> $midia->{'erros'}= [];
> eval{
> $bytes = $midia->qqcoisa();
> };
> if($EVAL_ERROR){
> print "vou adicionar o $EVAL_ERROR aqui\n";
> $erros+=1;
> My::Logger::log("err",$EVAL_ERROR,$id);
> push @{$midia->{'erros'}}, $EVAL_ERROR;
> next; # esta dentro de um foreach
> }
>
> Beleza, tudo parece bom, exceto que $EVAL_ERROR  simplesmente DESAPARECE
> depois do log(xxx);
> Eu revisei e esta funcao nao tem como alterar os parametros recebidos.
> Existe algum problema ao ler multiplas vezes o erro de um eval???
> Pode ser um problema de concorrencia entre multiplas threads (eu rodo isso
> dentro de um Test::Simple)? E é um problema deterministico.
> Eu tive q pegar o erro na primeira linha dentro do IF... para mim isso é
> mazica... :/

E é uma mágica irritante. Em perldoc -f eval: "...If there was no
error, $@ is guaranteed to be the empty string..."
ou seja, a função log() provavelmente está rodando um eval
bem-sucedido lá dentro, o que está colocando a string vazia em
$EVAL_ERROR. Para contornar o problema, atribua o erro para outra
variável logo após o eval original, e use essa variável invés da
variável padrão de erro.

-- 
   Eden Cardim       Need help with your Catalyst or DBIx::Class project?
  Code Monkey                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://blog.edencardim.com/            http://www.shadowcat.co.uk/servers/


Mais detalhes sobre a lista de discussão Rio-pm