• Publicidad

Redirigir la salida de error a una variable, fichero, etc

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Redirigir la salida de error a una variable, fichero, etc

Notapor erjuak » 2013-04-25 12:02 @543

Buenas tardes:

Tengo un script en Perl que hace una conexión por ftp y éste después de hacer una serie de acciones, sube un fichero a un servidor ftp.

Si provoco que este script falle, es decir, pongo en la programación, un error en la dirección IP del servidor o, también puede ser que el servidor ftp en un momento dado, esté caído.

Al lanzarse el script, se genera un mensaje de error, pero este mensaje sale por la salida de error estándar de Unix "2>", es decir:

/home/juan/scripts/ftp.pl
Can't call method "login" without a package or object reference at /home/juan/scriptsftp.pl line 103.

Mi pregunta es:

¿Hay alguna forma en que pueda procesar este mensaje dentro del código de Perl, que no sea haciendo una redirección a la hora de lanzar el script?

Vamos, que me gustaría redirigir este mensaje a alguna variable de forma que pueda después pintar un archivo con este mensaje.

¿Alguien me podría dar una idea?

¡Muchas gracias!

Un saludo
erjuak
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2013-03-07 11:52 @536

Publicidad

Re: Redirigir la salida de error a una variable, fichero, et

Notapor explorer » 2013-04-25 13:32 @606

Los mensajes de error salen a causa de la ejecución de un die() o de un carp(). Lo que puedes hacer es que no ocurra ese die().

Quiero decir, que si a la hora de crear el new() del objeto Net::FTP, nos devuelve un valor undef, en lugar de hacer un die(), podemos hacer un print() para informar al usuario, y luego terminar, o volver a intentarlo.

Pero hay otras situaciones en que eso no podemos controlarlo, por ejemplo cuando ese die() ocurre fuera de nuestro código (dentro de un módulo o de otro programa).

En esos casos, lo que se suele hacer es lo que se hace en otros lenguajes: rodeamos la(s) línea(s) peligrosas con una estructura que capture el error, y de esa forma, nuestro programa no se muere, y tiene la oportunidad de tratar el error.

Eso en Perl se hace con la función eval(). También puedes usar Try::Tiny o TryCatch (hay diferencias entre los dos en cuanto al tratamiento de los return).

Comentarios sobre Try::Tiny, discusión sobre el tratamiento de errores, con ejemplos de eval() y los otros módulos.

Más información sobre eval() en perldoc -f eval
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Redirigir la salida de error a una variable, fichero, et

Notapor danimera » 2013-04-25 21:12 @925

Puedes usar también el log handler...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Log::Handler;
  2.  
  3.     my $log = Log::Handler->new();
  4.  
  5.     $log->add(
  6.         file => {
  7.             filename => "file.log",
  8.             maxlevel => "debug",
  9.             minlevel => "warning",
  10.         }
  11.     );
  12.  
  13.     $log->warning("message");
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


con el try es bueno para que guardes en un fichero los mensajes de error
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Re: Redirigir la salida de error a una variable, fichero, et

Notapor erjuak » 2013-05-14 03:05 @170

Muchas gracias por la información recibida.
Al final, lo solucione programando los scripts en el crontab del servidor y redirigiendo la salida de error a un fichero de log.
Me dieron por bueno esa solución.

Muchas Gracias
erjuak
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2013-03-07 11:52 @536


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 38 invitados