En Perl, el manejo de errores se realiza tradicionalmente a través de las funciones die, warn, y el bloque eval. Para una terminación correcta del programa, se recomienda usar die para errores críticos y warn para advertencias. Otra forma es utilizar el operador de bloque eval para capturar errores fatales y manejarlos posteriormente.
Ejemplo:
open my $fh, '<', 'file.txt' or die "No se puede abrir el archivo: $! "; printf $fh "Hola" or warn "No se pudo escribir: $! "; # Manejo de error con eval my $result = eval { risky_function(); 1; }; unless ($result) { print "Error detectado: $@ "; }
También existen módulos como Try::Tiny y Error, que implementan try/catch para Perl.
¿Cuál es la diferencia entre usar eval {} y la cadena eval "...", y cuáles son las trampas de cada método?
Muchos piensan erróneamente que son idénticos.
eval { ... }funciona como un try/catch en bloque, mientras queeval "..."compila y ejecuta la cadena como código Perl en tiempo de ejecución. Al usar una cadena, es fácil cometer un error y potencialmente exponer el código a inyecciones SQL o errores de compilación.
Ejemplo de diferencias:
# Compila y ejecuta la cadena como código Perl my $var = 'my $x = 2 + 2'; eval $var; # eval SUCIO! # Variante en bloque segura my $error = eval { die "fallo"; }; print $@ if $@;
Historia
En un proyecto, los desarrolladores usaron eval "código" para la formación dinámica de comandos, lo que llevó a errores de sintaxis inalcanzables en tiempo de ejecución y problemas de depuración.
Historia
Captura incorrecta de errores: las excepciones lanzadas dentro de eval utilizando variables locales no fueron manejadas, ya que $@ era sobrescrito por la posterior llamada a la función log.
Historia
En código antiguo, en lugar de try/catch, solo se usaba die(), lo que resultaba en una terminación incontrolada del proceso Perl y pérdida de datos en transacciones de base de datos.