Tratamento de erros em Perl é o processo de execução da ação apropriada contra um programa que causa dificuldade de execução devido a algum erro no código ou no compilador. Os processos estão sujeitos a erros. Por exemplo, se abrir um arquivo que não existe gera um erro, ou acessar uma variável que não foi declarada gera um erro.
O programa irá parar se ocorrer um erro e, portanto, usando o tratamento de erros, podemos tomar as medidas adequadas em vez de interromper um programa completamente. O tratamento de erros é um requisito importante para qualquer linguagem sujeita a erros.

Os erros podem ser classificados pelo momento em que ocorrem:

  1. Erros de tempo de compilação
  2. Erros de tempo de execução

Erro de tempo de compilação: é um erro, como erro de sintaxe ou referência de arquivo ausente, que impede que o programa seja compilado com êxito.

Erro de tempo de execução: é um erro que ocorre quando o programa está em execução e esses erros geralmente são erros lógicos que produzem a saída incorreta.

Tratamento de erros em Perl

Perl fornece duas funções integradas para gerar exceções fatais e avisos, que são:

  1. morrer()
  2. avisar()

die(): Para sinalizar ocorrências de erros fatais no sentido de que o programa em questão não deve continuar.

Por exemplo, acessar um arquivo com open()informa se a operação de abertura foi bem-sucedida antes de prosseguir para outras operações de arquivo.

open FILE, "filname.txt" or die "Cannot open file: $!\n";

Nota: $! é uma variável predefinida que retorna a mensagem de erro retornada pelo sistema no erro.

warn(): Ao contrário da die()função, warn()gera um aviso em vez de uma exceção fatal.

Por exemplo:

open FILE, "filname.txt" or warn "Cannot open file: $!\n";

Outros métodos que podem ser usados ​​para lidar com erros

  • declaração if
  • a menos que função
  • Módulo ': try' de erro

A instrução if: As instruções em um bloco de código serão executadas apenas se a condição for verdadeira.

if(-e $filename)){
  print "File exists";
  
} else {
  die "Cannot open the file. $!"
}

a menos que função: As instruções no bloco de código só serão executadas se a expressão retornar falso.

unless(-e $filename) {
   die "File Does not Exist! $!";
}

O erro ': try': é semelhante ao bloco try e catch da linguagem de programação Java.

use Error ':try';
  
try{
  open FILE, "filename.txt" or die "File cannot be opened: $!";
  while () {
      # Do something
   }
   close FILE;
} catch Error::Simple with {
     my $err = shift;
     print "ERROR: $err";
};

Erro nos módulos

Até agora vimos como o Perl trata e informa sobre os erros ao programador, mas e se houver um erro em um módulo que precisa ser informado ao programador? Tais erros causarão dificuldade na execução de todos os códigos que importam aquele módulo específico.

Por exemplo, você cria um módulo, digamos test.pm , e estamos fazendo um cálculo errado, então uma mensagem de erro será lançada conforme mostrado abaixo:

package test;
sub functionName
{
   warn "Error in module!"
}
1;
use test;
functionName();

Saída:

Error in module! at test.pm line 6

Esta técnica de tratamento de erros pode ser usada pelos programadores para retificar todos os erros no módulo. Carp module()pode ser usado para fornecer métodos para relatar erros dentro dos módulos.

O Módulo Carpa

É uma alternativa para avisar e morrer para os módulos. É útil para módulos definidos pelo usuário porque eles agem como die()e warn(), mas com uma mensagem que é adicionada pelo programador.
Este módulo carpa fornece algumas funções que são:

  1. carpa()
  2. cluck()
  3. coaxar()
  4. confessar()

Função carp(): Esta função funciona de forma semelhante à função warn e imprime a mensagem dada pelo usuário sem sair do script.
Exemplo:

package test;
use Carp;
  
sub functionName
{
   carp "Error in module!"
}
1;
use test;
functionName();

Saída:

Error in module!  at test.pm line 8

função cluck(): esta função produz um contexto que é um resumo de todas as chamadas na pilha de chamadas. Ele segue o mesmo processo da carp()função, mas imprime uma pilha de todos os módulos que levaram à chamada da função específica.
Exemplo:

package Test;
use Carp qw(cluck);
  
sub function_name {
    cluck "Error in module!";
}
1;
use Test;
function_name();

Saída:

Error in module! at Test.pm line 5
   Test::function_name() called at test.pl line 2

função croak(): Esta função é semelhante à die()função, exceto que produz uma mensagem mais curta que relata o erro como sendo de onde seu módulo foi chamado.
Exemplo:

package Test;
use carp;
  
sub functionName {
    croak "Error in module!";
}
1;
use Test;
functionName();

Saída:

Error in module! at test.pl line 2

função confess(): Esta função é semelhante a cluck()function. Ele chama a função die e, em seguida, imprime uma pilha de todos os módulos que levaram à chamada da função específica.
Exemplo:

package Test;
use Carp;
  
sub functionName {
    confess "Error in module!";
}
1;
use Test;
functionName();

Saída:

Error in module! at Test.pm line 5
   Test::functionName() called at test.pl line 2