Controlando Errores en Tiempo de Ejecución con eval

La función eval recibe habitualmente una cadena como argumento, evaluándola como si de un programa Perl se tratara. Sin embargo, eval admite una segunda forma en la puede ser utilizado para manejar errores en tiempo de ejecución. en esta segunda forma recibe como argumento un bloque de código.

En el siguiente ejemplo atrapamos una excepción de división por cero:

> cat eval_excep.pl
#!/usr/bin/perl -w

use strict;

eval {
  my ($a, $b) = (10, 0);
  my $c = $a / $b;
};

print "Ocurrió un error: $@" if $@; # mensaje de error
Veamos el resultado de la ejecución:
> eval_excep.pl
Ocurrió un error: Illegal division by zero at eval_excep.pl line 7.

Para señalar los errores en nuestros programas usaremos die. Cuando die es ejecutado dentro de un eval el intérprete Perl deja la cadena de error en la variable $@ y sale del bloque. Veamos un ejemplo:

> cat eval_die.pl
#!/usr/bin/perl -w

use strict;

sub open_file {
  my $fn = shift;
  open (F, $fn) or die("No se pudo abrir el fichero $fn: $!\n");
}

my $fn = shift;
while (1) {
  eval { open_file($fn); };
  if ($@) { print "En main: $@\n"; }
  else { last; }
  print "Entre el nombre del fichero: ";
  chomp ($fn = <STDIN>);
}

while (<F>) { print; }
Veamos el resultado de una ejecución:
> eval_die.pl xx.pl
En main: No se pudo abrir el fichero xx.pl: No such file or directory

Entre el nombre del fichero: one.dat
1
2
3
0
4
0

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19