Perl - Manejo de errores

La ejecución y los errores siempre van de la mano. Si está abriendo un archivo que no existe. entonces, si no manejó esta situación adecuadamente, se considerará que su programa es de mala calidad.

El programa se detiene si ocurre un error. Por lo tanto, se utiliza un manejo de errores adecuado para manejar varios tipos de errores, que pueden ocurrir durante la ejecución de un programa y tomar la acción apropiada en lugar de detener el programa por completo.

Puede identificar y detectar un error de varias formas diferentes. Es muy fácil atrapar errores en Perl y luego manejarlos correctamente. Aquí hay algunos métodos que se pueden utilizar.

La declaración if

los if statementes la opción obvia cuando necesita verificar el valor de retorno de una declaración; por ejemplo -

if(open(DATA, $file)) {
   ...
} else {
   die "Error: Couldn't open the file - $!";
}

Aquí variable $! devuelve el mensaje de error real. Alternativamente, podemos reducir la declaración a una línea en situaciones en las que tenga sentido hacerlo; por ejemplo -

open(DATA, $file) || die "Error: Couldn't open the file $!";

La función a menos que

los unlessla función es lo opuesto lógico a if: las declaraciones pueden omitir completamente el estado de éxito y solo se pueden ejecutar si la expresión devuelve falso. Por ejemplo

unless(chdir("/etc")) {
   die "Error: Can't change directory - $!";
}

los unlessLa declaración se usa mejor cuando desea generar un error o una alternativa solo si la expresión falla. La declaración también tiene sentido cuando se usa en una declaración de una sola línea:

die "Error: Can't change directory!: $!" unless(chdir("/etc"));

Aquí morimos solo si falla la operación chdir, y se lee bien.

El operador ternario

Para pruebas muy cortas, puede utilizar el operador condicional ?:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

Aquí no está tan claro lo que estamos tratando de lograr, pero el efecto es el mismo que usar un if o unlessdeclaración. El operador condicional se usa mejor cuando desea devolver rápidamente uno de los dos valores dentro de una expresión o declaración.

La función de advertencia

La función de advertencia solo genera una advertencia, se imprime un mensaje en STDERR, pero no se realizan más acciones. Por lo tanto, es más útil si solo desea imprimir una advertencia para el usuario y continuar con el resto de la operación:

chdir('/etc') or warn "Can't change directory";

La función de morir

La función die funciona igual que advertir, excepto que también llama a exit. Dentro de un script normal, esta función tiene el efecto de terminar inmediatamente la ejecución. Debe utilizar esta función en caso de que sea inútil continuar si hay un error en el programa -

chdir('/etc') or die "Can't change directory";

Errores dentro de los módulos

Hay dos situaciones diferentes que deberíamos poder manejar:

  • Informar un error en un módulo que cita el nombre de archivo del módulo y el número de línea: esto es útil cuando se depura un módulo, o cuando específicamente desea generar un error relacionado con el módulo, en lugar de relacionado con el script.

  • Informar un error dentro de un módulo que cita la información de la persona que llama para que pueda depurar la línea dentro del script que causó el error. Los errores planteados de esta manera son útiles para el usuario final, porque resaltan el error en relación con la línea de origen del script que realiza la llamada.

los warn y dieLas funciones funcionan de forma ligeramente diferente de lo que cabría esperar cuando se llaman desde un módulo. Por ejemplo, el módulo simple -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   warn "Error in module!";
}
1;

Cuando se llama desde un script como el siguiente:

use T;
function();

Producirá el siguiente resultado:

Error in module! at T.pm line 9.

Esto es más o menos lo que podría esperar, pero no necesariamente lo que desea. Desde la perspectiva del programador de un módulo, la información es útil porque ayuda a señalar un error dentro del propio módulo. Para un usuario final, la información proporcionada es bastante inútil, y para todos menos para el programador endurecido, es completamente inútil.

La solución para tales problemas es el módulo Carp, que proporciona un método simplificado para informar errores dentro de los módulos que devuelven información sobre el script de llamada. El módulo Carp ofrece cuatro funciones: carpa, cloqueo, croar y confesión. Estas funciones se describen a continuación.

La función de la carpa

La función carp es el equivalente básico de advertir e imprime el mensaje en STDERR sin salir del script e imprimir el nombre del script.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   carp "Error in module!";
}
1;

Cuando se llama desde un script como el siguiente:

use T;
function();

Producirá el siguiente resultado:

Error in module! at test.pl line 4

La función cluck

La función cluck es una especie de carpa sobrealimentada, sigue el mismo principio básico pero también imprime un seguimiento de la pila de todos los módulos que llevaron a la función que se llama, incluida la información en el script original.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);

sub function {
   cluck "Error in module!";
}
1;

Cuando se llama desde un script como el siguiente:

use T;
function();

Producirá el siguiente resultado:

Error in module! at T.pm line 9
   T::function() called at test.pl line 4

La función croar

los croak la función es equivalente a die, excepto que informa de la persona que llama un nivel más arriba. Al igual que die, esta función también sale del script después de informar el error a STDERR -

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   croak "Error in module!";
}
1;

Cuando se llama desde un script como el siguiente:

use T;
function();

Producirá el siguiente resultado:

Error in module! at test.pl line 4

Al igual que con la carpa, se aplican las mismas reglas básicas con respecto a la inclusión de información de línea y archivo de acuerdo con las funciones de advertencia y matriz.

La función confesar

los confess la función es como cluck; llama a die y luego imprime un seguimiento de pila hasta el script de origen.

package T;

require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;

sub function {
   confess "Error in module!";
}
1;

Cuando se llama desde un script como el siguiente:

use T;
function();

Producirá el siguiente resultado:

Error in module! at T.pm line 9
   T::function() called at test.pl line 4