2 votes

Comment utiliser les exceptions Perl ?

J'ai un problème Perl du type suivant :

$object1 = $ABC->Find('test1');

Je veux ensuite appeler un sous-programme appelé CheckResult en Report.pm :

$Report->CheckResult($object, "Finding the value");

Dans un autre cas, je veux savoir si une commande particulière a été exécutée, alors je fais quelque chose comme ça :

$Report->CheckResult($ABC->Command(100,100), "Performing the command");

Maintenant dans Report.pm :

sub CheckResult {
    my ($result, $information) = @_;
    # Now, I need something like this
    if ($result->isa('MyException')) {
        # Some code to create the report
    }
}

Comment utiliser la classe d'exception et comment vérifier si une exception est levée et, le cas échéant, effectuer la tâche nécessaire ?


Edita:

Pour l'instant, je dispose d'un module de ce type :

package MyExceptions;

use strict;
use warnings;

use Exception::Class (
    'MyExceptions',
    'MyExceptions::RegionNotFound'     => {isa => 'MyExceptions'},
    'MyExceptions::CommandNotExecuted' => {isa => 'MyExceptions'}
);

L'autre module est :

package ReportGenerator;

use strict;
use warnings;

sub CheckResult {
    my ($result, $info) = @_;

    # Here is want to check of $result and throw an exception of the kind
    # MyExceptions::RegionNotFound->throw(error => 'bad number');
    # I'm not sure how to do this
}
1;

L'utilisateur pourrait à son tour script quelque chose comme ceci :

$Report->CheckResult($ABC->Command(100,100), "Tapping Home");

Quelqu'un peut-il nous aider ? Désolé pour mon ignorance, je n'ai jamais fait d'exceptions.

3voto

Axeman Points 24103

Il n'est pas utile de lancer une exception et que l'utilisateur exécute un code qui ne l'attrape pas. Le code pour Exception::Class est très simple :

# try
eval { MyException->throw( error => 'I feel funny.' ) };

# catch
if ( $e = Exception::Class->caught('MyException') ) {
    ...

Il montre donc à la fois le code de lancement et le code du client. Le code eval est à la fois la syntaxe "try" et "throw". Le reste est du rattrapage. Donc, dans une sorte de régurgitation de haut niveau de vos spécifications, cela ressemblerait à quelque chose comme ceci :

if ( !Object->find_region( $result )) { # for OO goodness
    MyExceptions::RegionNotFound->throw( error => 'bad number' );
}

Votre code client testerait simplement - je vous recommande de tester réellement (et congélation ) $@ d'abord.

eval { 
    $Report->CheckResult($ABC->Command(100,100), "Tapping Home");
};
if ( my $ex = $@ ) { # always freeze $@ on first check
    my $e;
    if ( $e = Exception::Class->caught('MyExceptions::RegionNotFound')) { 
        warn( $e->error, "\n", $e->trace->as_string, "\n" );
    }
}

-2voto

manu_v Points 362

Dans Report.pm :

sub CheckResult {
    try {
        $Report->CheckResult($object,”Finding the value”);
    } catch MyException with {
       # Exception handling code here
    };
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X