[SP-pm] Tratamento de erros

Marcio - Google marciorp at gmail.com
Wed Mar 13 11:26:29 PDT 2013


use strict;
use warnings;
use DBI;
use Asterisk::AMI;
use POSIX qw/strftime/;

$|=1;

print "Iniciando...\n";
print "[" . strftime('%d-%m-%Y %H:%M:%S', localtime) . "] PID: $$\n";

...
eval {
our $connDB = DBI->connect('DBI:mysql:ast_tm;host=bd07.internal.dc',
'***********', '************') ||
              die "Nao foi possivel conectar na base de dados:
$DBI::errstr";

our $selTM = $connDB->prepare("SELECT ID_Lote, ID_Lote_TM, Numero, Texto,
FlgConfirmacao, FlgStatus_Lote, FlgStatus_TM FROM vw_TM_Pendente WHERE
(Prioridade > 6) LIMIT 100");
our $updTMc = $connDB->prepare("UPDATE MOV_Lote SET FlgStatus=? WHERE
ID=?");
our $updTMi = $connDB->prepare("UPDATE MOV_Lote_TM SET FlgStatus=?,
DtHrEnvio=?, OutChannel=? WHERE ID=?");
our $insTMl = $connDB->prepare("INSERT INTO LOG_TM_Main (ID_Lote,
DtHrEvento, FlgStatus, Status) VALUES (?, ?, ?, ?)");

...

        $insTMl->execute($ID_Lote, strftime('%Y-%m-%d %H:%M:%S',
localtime), 13, $Status);

...
}
if ($@) {
$Log($@);

# Verifica qual foi o erro, se foi na conexão, conecta em outro server. Se
foi no insert, executa uma rotina de atualização da chave, etc.
...
}

our $AMI = Asterisk::AMI->new(PeerAddr => 'pbx16.internal.dc',
                              PeerPort => '5038',
                              Username => '*******',
                              Secret => '********'
                             ) || die "Nao foi possivel conectar no
Asterisk!";
...

   eval {

      my $actid = $AMI->send_action({   ...
                                    });

      my $respact = $AMI->get_response($actid);

...

      $chnResponse = $respact->{'Response'};
      $chnMessage = $respact->{'Message'};
      $chnChannel = $respact->{'PARSED'}->{'Channel'};

...
   };

   if (($@) || ($chnResponse eq "Error")) {

...

      return 0;
   }
   else {
...

      return 1;
   }


Esse ai é um pedaço de um dos programas, por questões contratuais eu não
posso postar o código.

No primeiro "eval" quando ocorre erro de conexão ele na aborta o programa,
mais quando ocorre erro no insert, aborta. Tem algumas outras instruções
ali, como manipulação de data/hora e abertura de arquivos texto. Algumas
não abortam e são tratadas logo abaixo, outras abortam, principalmente os
erros evolvendo os arquivos texto.

No segundo "eval", quando o {'channel'} não vem aborta, ou quando a conexão
com o Asterisk caiu e eu tento executar o send_action. Ou outros erros não
abortam.

Precisava de uma forma que nenhum erro abortasse para poder trata-los ou
pelo menos gravar log.

[...]'s

Marcio
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130313/d4c34831/attachment.html>


More information about the SaoPaulo-pm mailing list