[SP-pm] [hipóteses...]
André Garcia Carneiro
andre.garcia.carneir em terra.com.br
Terça Março 6 13:04:42 PST 2007
> Boa tarde Luis,
>
> Obrigado pela resposta e pelo tempo despendido com isso.
>
> Esta foi apenas uma questão hipotética e com certeza foi um tanto
> quanto confusa minha colocação.
>
> Na prática o que eu quero é automatizar algumas funções que, por vezes
> tenho que utilizar. Isso inclui acessos à banco de dados ou protolos
> específicos (as vezes utilizando módulos do cpan). Minha dúvida surgiu,
> inicialmente, pela necessidade de tratar o retorno de alguma função do
> módulo de forma diferente.
>
> Exemplificando:
> Em um determinado programa eu preciso fazer uma conexão com um banco de
> dados e, em caso de falha, pouco me importa o porque. Apenas saber que a
> conexão falhou já me basta. E isso eu consigo facilmente utilizando
> valores de retorno da função de conexão ao banco.
> Porém, em uma segunda hipótese eu preciso tratar o erro que me é
> retornado. E, sem quebrar a estrutura inicial (utilizando valores
> numéricos de retorno), eu precisaria saber o erro. Então pensei em
> utilizar a mesma estrutura do módulo, algo como:
>
> sub connect {
> my $self = shift;
>
> if (!connect_to_db()) {
> $self->{mensagem_de_erro} = 'Erro específico';
> return 0;
> }
> return 1;
> }
>
> Com isso eu resolveria os dois problemas. Teria o retorno e a mensagem
> de erro, caso esta fosse necessária.
>
> Lembre-se que esta é uma situação hipotética e simples. Mas, se eu
> conseguir entender qual a melhor maneira de se fazer isso, terei
> resolvido diversos outros problemas estruturais e poderei começar a
> desenvolver meus módulos tranquilamente.
>
> Na prática a dúvida é: se eu receber a hash como argumento da função e
> alterá-la, essa alteração terá validade apenas dentro dessa função ou
> dentro da função que a chamou também?
>
> Ou ainda:
> sub connect {
> my $self = shift;
>
> if (!connect_to_db()) {
> $self->{mensagem_de_erro} = 'Erro';
> return 0;
> }
> return 1;
> }
>
> Teria o mesmo efeito que:
> sub connect {
> my $self = shift;
>
> if (!connect_to_db()) {
> $self->{mensagem_de_erro} = 'Erro';
> }
> return $self;
> }
> ?????
>
> Espero ter sido um pouco mais claro agora.
> E, novamente, obrigado pelo tempo perdido com a resposta.
>
> Luis Motta Campos wrote:
>
> --
> Thomas Storino Britis
> TCNet Informatica e Telecomunicacoes LTDA
>
>
Bom se eu entendi, o que você quer pode estar mais ou menos por aqui:
<code>
use strict;
use warnings;
use DBI; #suponde que você está usando DBI
my $dbh = DBI->connect(<parametros>,{RaiseError=>1,AutoCommit=>0});
my $sth ;
eval{
$dbh->prepare_cached(qq{codigo sql});
$sth->execute;
};
if($@ || $DBI::strerr)
{
#opa... deu zica!
$@ .= $DBI::strerr;
$dbh->rollback;
}
else
{
#executou ok
$dbh->commit;
}
$sth->finish;
$dbh->disconnect;
</code>
Para mais detalhes, por favor consulte o CPAN...
Agora se não é isso o que você perguntou, me desculpe ...
--
André Garcia Carneiro
Developer(Perl/PHP)
Member of "São Paulo Perl Mongers" - http://sao-paulo.pm.org
Mais detalhes sobre a lista de discussão SaoPaulo-pm