Manejar warnings y excepciones en Perl

Cuando el código de nuestro script Perl genera warnings o excepciones ambos se envían al STDERR (una de los flujos estándares de datos). Adicionalmente podemos “atraparlos” (catch) y “manejarlos” (handle) con ciertos bloques de código.

Los warnings se pueden atrapar de la siguiente manera:

local $SIG{__WARN__} = sub {
  my $message = shift;
  #CODIGO DE TRATAMIENTO DE WARNING
};

Ejemplo:

sub db_connect {
  ...
  local $SIG{__WARN__} = sub {
    my $message = shift;
    return 'DB_CONN_ERROR';
  };
  ...
  my $dbh = DBI->connect("dbi:mysql:test:localhost:3306", "test", "secure",{PrintError => 1});

Así, cuando falle la conexión a la base de datos la función devolverá el código de error correspondiente para que la aplicación responda a esa situación.

Las excepciones se pueden atrapar de manera análoga a los warnings:

local $SIG{__DIE__} = sub {
  my $message = shift;
  #CODIGO DE TRATAMIENTO DE EXCEPCION
};

En este caso, también existe una forma alternativa:

eval {
  #CODIGO QUE PUEDE GENERAR EXCEPCION
};
if( $@ ){
  #CODIGO DE TRATAMIENTO DE EXCEPCION
}

Ejemplo:

eval {
  mkpath($ubicacion);
}
if( $@ ){
  $path = $ubicacion;
}

Así, cuando falle la la creación del path indicado en la variable $ubicacion porque el mismo ya existe, se asigna a la variable $path.

Anuncios

Activar warnings en Perl

Por defecto los warnings están desactivados en Perl. Si nuestro código no se comporta correctamente no veremos estas advertencias de manera temprana y podríamos encontrarnos con problemas graves a futuro.

Los warnings se pueden activar de varias formas, estas son algunas de ellas:

Con el pragma warnings en un bloque de código

El indicar use warnings; activa los warnings hasta el final del bloque o bien hasta que se indique no warnings;

No afecta a los módulos incluidos (con use, require o do)

Esta es la forma recomendada. Provee más control de los warnings porque se puede activar donde y cuando se desee.

Con el parámetro -w o -W en el shebang del script

En la primer línea del script (shebang) se agrega uno de los 2 parámetros:

#!/usr/bin/perl -w

Con -w se activan los warnings en todo el código del script y módulos incluidos, excepto donde se utilice el pragma warnings (que tiene precedencia)

Con -W se activan los warnings en todo el código del script y módulos incluidos sin excepción.

Con la variable $^W = 1

Con ambos parámetros -w y -W, la variable Perl $^W se establece en 1. De la misma manera, podemos hacer esto directamente en el código:

$^W = 1;

Activa los warnings hasta el final del script y los módulos que se incluyan (solo con require o do), excepto donde se utilice el pragma warnings (que tiene precedencia)