Pregunta

¿Hay alguna manera en Perl para declarar que un método puede lanzar un error (o morir)?

EDIT:. Lo que me interesa más es una manera de conseguir el compilador o IDE para decirme que tengo una excepción no comprobada en algún lugar en mi código

Siempre me ha gustado la forma en Java, un método podría manejar una excepción y / o tirarlo. La firma del método permite poner "tiros MiExcepción", por lo que un buen IDE / compilador sabría que si se utiliza dicho método en algún lugar de su código, que tendría que comprobar la excepción o declarará su función en "lanza" la otra excepción .

Soy incapaz de encontrar algo parecido en Perl. Un colega mío escribió un método que "muere" en la entrada incorrecta, pero me olvide de eval-if ($ @) que ... offcourse el error fue descubierto mientras que un usuario se ejecuta la aplicación.

(offcourse dudo si hay alguna IDE existente que podría encontrar este tipo de cosas para Perl, pero al menos Perl -cw debe ser capaz de, no?)

¿Fue útil?

Solución

Dos respuestas posibles. Recoger lo que le guste más:

  1. En Perl, esto se indica por el POD del módulo. No hay manera de marcar mediante programación, por lo que deberá contar con la documentación en su lugar.

  2. Cualquier método puede die, o al menos cualquier método no trivial. Va a llamar otra cosa, lo que probablemente pide otra cosa, etc., por lo que la única manera de garantizar que no es una excepción será lanzada es rastrear a través de todos los niveles de (potenciales) llama para verificar que no hay nada que die poder . Mucho más pragmático que acaba de asumir que las excepciones son siempre una posibilidad y el código en consecuencia.

Editado para añadir: Como regla general, Perl5 y análisis de código estático en realidad no se llevan del todo bien. Mi entendimiento es que esta es una de las motivaciones detrás de la lengua en el rediseño Perl6, lo que puede tener mejor suerte allí.

Otros consejos

No he visto algo como esto pero quizás atributos subrutina puede obtener su parte del camino?

Aquí hay una pequeña prueba de concepto Attribute::Handlers

ThrowsExceptionHandler.pm

package ThrowsExceptionHandler;
use Modern::Perl;
use Attribute::Handlers;

our @subs;

sub ThrowsException :ATTR(CODE) {
    push @subs, {
        package  => $_[0],
        symbol   => $_[1],
        subname  => *{$_[1]}{NAME},
        referent => $_[2],
        attr     => $_[3],
        data     => $_[4],
        phase    => $_[5],
        filename => $_[6],
        linenum  => $_[7],
    };
}

sub does_throw {
    my ($class, $subname) = @_;
    (grep { $_->{subname} eq $subname } @subs) ? 1 : 0;
}

1;

example.pl

use Modern::Perl;
use base qw(ThrowsExceptionHandler);

sub baz :ThrowsException {
    die "Throws error";
}

sub foo {
    warn "warning only";
}


say ThrowsExceptionHandler->does_throw( 'baz' );  # => 1
say ThrowsExceptionHandler->does_throw( 'foo' );  # => 0

Tal vez (una mezcla de) PPI , Perl::Critic y / o Padre puede ser adaptado para su uso algo como esto?

/ I3az /

Ha comprobado CPAN ? error :: TryCatch es una opción , Excepción :: Clase es otra , etc, etc.

También, ver orientada a objetos manejo de excepciones en Perl .

a partir del documento " excepciones "

  1. $ @ no nos dice dónde se produjo el error

  2. Podemos evitar esto con una función personalizada:

    sub tiro { mi desorden $ = join ( '', @_); $ Desastre = ~ s / \ n $ / \ n /?; mi $ i = 1; $ Local de "=" '' "; empaquetar DB; mientras que (mis @parts = persona que llama ($ i ++) {) $ q mi; $ Q = "'" si @DB :: args; $ = Desastre. "-> $ parts3". "A $ partes 1 línea $ partes 2 \ n"; } $ morir desastre; }

Con esto también se puede tomar referencias de " CPAN " y " objeto de excepción Oriented Handling en Perl "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top