• Publicidad

Cómo detectar un código de error al ejecutar comando

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

Cómo detectar un código de error al ejecutar comando

Notapor neodani » 2013-05-25 16:44 @739

Buenas noches.

Tengo un script en Perl para realizar copias de BD de MySQL, y quiero poder detectar cuándo se ejecuta bien o cuándo da algún error, pero no consigo cazar las excepciones de errores.

¿Sabéis cómo puedo saber si un comando se ejecutó correctamente o dio algún error en Perl?

Orden que utilizo (acepto consejos):

system("/usr/bin/mysqldump -u $userDB --password=$passwordDB --single-transaction --routines --events --triggers --hex-blob $bd | /bin/gzip -c > $DST/$DATA" . "_" . $bd . ".sql.gz");

Ej. de excepciones:
mysqldump: Got error: 1045: Access denied for user 'root'@'localhost' (using password: YES) when trying to connect

DBI connect('database=mysql;user=root;password=xxxxxxxxxxx','',...) failed: Can't connect to local MySQL server through socket

Muchas gracias.
neodani
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2013-05-08 01:14 @093

Publicidad

Re: Cómo detectar un código de error al ejecutar comando

Notapor explorer » 2013-05-25 20:44 @906

Después de la llamada a system(), puedes hacer esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if ( $? == -1 ) {
  2.     print "fallo al ejecutar: $!\n";
  3. }
  4. elsif ( $? & 127 ) {
  5.     printf "El proceso murió con la señal%d, %s volcado de memoria\n", ( $? & 127 ), ( $? & 128 ) ? 'con' : 'sin';
  6. }
  7. else {
  8.     printf "El proceso salió con el valor %d\n", $? >> 8;
  9. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
(sacado de perldoc -f system).

Si todo ha ido bien, el resultado debería ser 0. Si no, otro valor. Tienes los valores descritos en la página Types of Error Values de MySQL.

Otra cosa son los errores del DBI...

Si, en el momento de hacer la conexión (connect()), le pones la opción RaiseError => 1, entonces DBI generará un error en lugar de devolver códigos de error. Entonces... como dice la página de manual de DBI, este comportamiento se suele usar junto con el de eval{}, para que las excepciones sean capturadas, y luego compruebas el valor de $@ para ver qué errores se han producido. Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.          eval {
  2.            ...
  3.            $sth->execute();
  4.            ...
  5.          };
  6.          if ($@) {
  7.                     # $sth->err y $DBI::err serán verdaderos si el error se generó en DBI
  8.            warn $@; # imprime el error
  9.            ...;     # tratar el error aquí
  10.          }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Más información en la sección RaiseError de DBI.
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


Volver a Básico

¿Quién está conectado?

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