Como Evitar la Muerte (de un Programa)

¿Cual es el comportamiento correcto de una función cuando es llamada con argumentos erróneos? Parece razonable que el comportamiento de tal función sea advertir al programador de la conducta anómala y en su caso detener la ejecución del programa llamando a die o a croak.

¿Que ocurre si dentro de un programa de prueba .t queremos comprobar el funcionamiento de tal subrutina bajo situaciones de ''stress'' como esta, por ejemplo, con argumentos erróneos?

La respuesta es que - si se hace una llamada convencional - la llamada a die dentro de la subrutina investigada provocará la ''muerte prematura'' del programa de pruebas.

A continuación realizamos una prueba para comprobar el funcionamiento cuando se le pasan a Knap01DP vectores de pesos y beneficios de distinto tamaño. Recordemos que en la rutina Knap01DP habíamos escrito el siguiente código:

14  sub Knap01DP {
15    my $M = shift;
16    my @w = @{shift()};
17    my @p = @{shift()};
18
19    my $N = @w;
20    my @f;
21
22    croak "Profits and Weights don't have the same size" 
                              unless scalar(@w) == scalar(@p);
23
..    ....................................................
38    return @f;
39  }
40
41  sub ReadKnap {
42    my $filename = shift;
43
44    my $file = IO::File->new("< $filename");
45    croak "Can't open $filename" unless defined($file);
..    ............
47
55    return ($M, \@w, \@p);
56  }
por tanto, pasarle a la rutina vectores de distinto tamaño hace que el programa muera. Es por esto que protegeremos la ejecución dentro de un eval:
37  # test to check when weights and profits do not have the same size
38  $M = 100; @$w = 1..5; @$p = 1..10;
39  eval { Knap01DP($M, $w, $p) };
40  like $@, qr/Profits and Weights don't have the same size/;

Ahora la llamada a croak dentro de Knap01DP sólo produce la finalización del eval . El mensaje emitido por croak o die queda en la variable especial $@.

La función like comprueba que el primer argumento casa con la expresión regular especificada en el segundo argumento.

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19