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.