[SP-pm] Sinal de metodo nao existente

Solli Honorio shonorio em gmail.com
Sábado Abril 26 15:36:04 PDT 2008


Puxa Adriano interessante este hack e o módulo, mas é bom deixar claro um
negócio para as "crianças" da lista : "Não faça isto em casa sem a
supervisão de um adulto :) ".

Se eu entendi o que o Lucas está querendo é 'desabilitar' o tratamento de
erro, mas isto tem os teus problemas, tipo nunca conseguir descobrir um
problema no sistema :( !!!

Só enfatizando a importância e necessidade de um tratamento de erro, gosto
de utilizar uma experiência que tive com o Champs. Estavamos trabalhando num
projeto e ele me mostrou que na codificação do módulo eu tenho que me
preocupar apenas com o meu universo, qualquer coisa diferente disto devo
gerar uma excessão (erro) e madar o código para cima. As camadas superiores
é quem devem cuidar de erros não esperados, e se não o tratar morrer na cara
do usuário.

É isto aí, cada vez mais descobrimos que podemos fazer quase tudo bem perl,
mas temos que utilizar esta força com cuidado.

Abraços,

Solli M. Honório

2008/4/26 Adriano Ferreira <a.r.ferreira em gmail.com>:

> 2008/4/25 Lucas Mateus <lucasmateus.oliveira em gmail.com>:
>  > use Net::FTP;
> >
> > BEGIN {
> >     $SIG{__DIE__} = 'IGNORE'
> > }
> >
> > my $ftp = Net::FTP->new();
> >
> > $ftp->abcd;
> >
> > print "TESTE\n";
> > exit(1);
> >
> >
> > Alguem sabe dizer se esse erro emite sinal ?
>
> Eu acabei de lembrar de um 'hack' horrível para fazer com que Net::FTP
> ignore completamente a falta de um método chamado sobre suas
> instâncias, como é o caso do "$ftp->abcd" no seu exemplo.
>
> Isto pode ser feito através do Class::BlackHole
> (http://search.cpan.org/perldoc?Class::BlackHole).
>
> Abaixo está um ligeira modificação do seu exemplo. Ao invés de setar
> em um BEGIN, o $SIG{__DIE__} para 'IGNORE' que não funciona, o
> Class::BlackHole é carregado (via require) e adicionado ao final do
> @ISA do Net::FTP. Daí em diante, qualquer chamada de método
> inexistente em instâncias de Net::FTP será complacente e não fará
> absolutamente nada (inclusive não morrerá com "Can't locate object
> method "abcd" via package "Net::FTP"").
>
> Foi necessário transformar o
>
>     Net::FTP->new()
>
> para
>
>     Net::FTP->new( $host )
>
> pois do contrário o construtor do Net::FTP retorna 'undef' por não
> achar um servidor ftp válido. (Sobre "undef", método nenhum pode ser
> chamado.)
>
> Experimente este código em um arquivo "lucas.pl"
>
> $ perl lucas.pl ; echo $?
> TESTE
> 1
>
>
> #############
>
> # lucas.pl
> use Net::FTP;
>
> #BEGIN {
> #    $SIG{__DIE__} = 'IGNORE'
> #  }
>
> BEGIN {
>  require Class::BlackHole;
>    push @Net::FTP::ISA, qw( Class::BlackHole )
> }
>
> my $ftp = Net::FTP->new( 'cpan.hexten.net' );
>
> $ftp->abcd;
>
> print "TESTE\n";
> exit(1);
>
> #############
>
> > _______________________________________________
> >  SaoPaulo-pm mailing list
> >  SaoPaulo-pm em pm.org
> >  http://mail.pm.org/mailman/listinfo/saopaulo-pm
> >
> _______________________________________________
> SaoPaulo-pm mailing list
> SaoPaulo-pm em pm.org
> http://mail.pm.org/mailman/listinfo/saopaulo-pm
>



-- 
"o animal satisfeito dorme". - Guimarães Rosa
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/saopaulo-pm/attachments/20080426/95efc2a2/attachment.html 


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