Gestion des erreurs (Programmation CGI avec Perl)

5.5.4. Module personnalisé

C’est une bonne idée de créer votre propre module Perl spécifique à notre site. Si vous hébergez différents sites ou si vous avez des applications différentes au sein de votre site avec des looks et des sensations différents, vous souhaiterez peut-être créer un module pour chacun. Dans ce module, vous pouvez placer des sous-programmes que vous utilisez vous-même dans de nombreux scripts CGI.Ces sous-programmes varient en fonction de votre site, mais il faut gérer les erreurs.

Si vous n’avez pas créé votre propre module Perl auparavant, ne vous inquiétez pas, c’est assez simple. L’exemple 5-3 montre un module minimal avery.

Exemple 5-3. CGIBook::Error.pm

#!/usr/bin/perl -wTpackage CGIBook::Error;# Export the error subroutineuse Exporter;@ISA = "Exporter";@EXPORT = qw( error );$VERSION = "0.01";use strict;use CGI;use CGI::Carp qw( fatalsToBrowser );BEGIN { sub carp_error { my $error_message = shift; my $q = new CGI; my $discard_this = $q->header( "text/html" ); error( $q, $error_message ); } CGI::Carp::set_message( \&carp_error );}sub error { my( $q, $error_message ) = @_; print $q->header( "text/html" ), $q->start_html( "Error" ), $q->h1( "Error" ), $q->p( "Sorry, the following error has occurred: " ), $q->p( $q->i( $error_message ) ), $q->end_html; exit;}1;

La seule différence entre un module Perl et un script Perl standard estque vous devez enregistrer votre fichier avec a.pm extension, déclare le nom du paquet du module avec la fonction de paquet (cela doit correspondre au nom du fichier sauf sans the.pm extension et substitution de ::for /), et assurez-vous qu’il renvoie une valeur vraie lorsqu’il est évalué (la raison de the1; en bas).

Lors de la détermination du nom du paquet, le nom du fichier doit être lié à un chemin de bibliothèque dans @INC. Dans notre exemple, nous stockons le fichier dans /usr/lib/perl5/site_perl/5.005/CGIBook/Error.pm. /usr/lib/perl5/site_perl/5.005 est un répertoire de bibliothèque. Ainsi, le chemin d’accès au module par rapport à librarydirectory est CGIBook/Error.pm, donc le paquet estcgibook::Error.

Il est courant de stocker la version du module dansVERSIONVERSION. Par souci de commodité, nous utilisons également le module Exportateur pour exporter le sous-programme d’erreur. Cela nous permet de nous référer à cela dans nos scripts comme une erreur au lieu de CGIBook::Exporter::error. Reportez-vous à la page de manuel de l’exportateur ou à un texte Perl principal, tel que la programmation de Perl, pour plus de détails sur l’utilisation d’Exporter.

Vous avez quelques options pour enregistrer ce fichier. La solution la plus simple consiste à l’enregistrer dans le répertoire site_perl de vos bibliothèques Perl, telles que /usr/lib/perl5/site_perl/5.005/CGIBook/Error.pm. Le répertoire site_perl inclut des modules spécifiques au site (c’est-à-dire non inclus dans la distribution standard de Perl). Les chemins de vos bibliothèques Perl peuvent différer; vous pouvez les localiser sur votre système avec la commande suivante:

$ perl -e 'print map "$_\n", @INC'

Vous souhaitez probablement créer un sous-répertoire unique à votre organisation, comme nous l’avons fait avec CGIBook, pour contenir tous les modules Perl que vous créez.

Vous pouvez utiliser le module comme suit:

#!/usr/bin/perl -wTuse strict;use CGI;use CGIBook::Error;my $q = new CGI;unless ( check_something_important( ) ) { error( $q, "Something bad happened." );}

Si vous n’avez pas l’autorisation d’installer le module dans votre répertoire Perllibrary, et si vous ne pouvez pas demander à votre administrateur système de le faire, vous pouvez placer le module dans un autre emplacement, par exemple, /usr/local/apache/perl-lib/CGIBook/Error.pm.Ensuite, vous devez vous rappeler d’inclure ce répertoire dans la liste Quiperl recherche des modules. Le moyen le plus simple de le faire estavec leib pragma:

#!/usr/bin/perl -wTuse strict;use lib "/usr/local/apache/perl-lib";use CGI;use CGIBook::Error;...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.