Sei que este tema ja foi largamente discutido na comunidade e que temos várias formas de fazer isso com módulo e tudo mais… mas a intenção deste post realmente não é dar uma bala de prata para a resolução do problema.
Vamos a explicação:
PROBLEMA: Temos um código que é propicio a “exceções” e gostaríamos de fazer uma tratativa para verificar quando estes códigos “morrem”.
package FileOp;
sub new {
return bless {}, shift || ref shift;
}
sub open_file {
my $self = shift;
open my $file, shift or die $!;
...
close $file;
}
package main;
my $file = FileOp->new;
my $foo = $file->open_file( './file.txt' ); # die "arquivo não existe"
PROPOSTA: Uso do eval {}
use Carp;
my $file = FileOp->new;
eval {
my $foo = $file->open_file( './file.txt' ); # die "arquivo não existe"
...
};
if ( $@ ) {
say "O sistema foi encerrado porque: ". $!;
}
Isso é uma solução simples e primária para o problema, porem no CPAN existem inúmeros módulos que tratam fluxo de erros, exceptions, etc..
Abaixo eu sito alguns:
Carp – http://search.cpan.org/~jesse/perl-5.14.1/lib/Carp.pm
Try::Tiny – http://search.cpan.org/~doy/Try-Tiny-0.09/lib/Try/Tiny.pm
TryCatch – http://search.cpan.org/~ash/TryCatch-1.003000/lib/TryCatch.pm
Throwable – http://search.cpan.org/~rjbs/Throwable-0.102080/lib/Throwable.pm
… e muitos outros! ; )
Fica a dica, tratem os fluxos de erros do seu sistema, pois isso é tão [importante quanto|faz parte] o desenvolvimento das funcionalidades do seu sistema.
