¿Cómo crear y lanzar excepciones en Perl?

CorePress2024-01-24  8

Por ejemplo, php tiene una excepción como InvalidArgumentException con el mensaje personalizado 'Grupo actual no encontrado'.

Y puedo lanzar esta excepción en el código.

if ($groupId === 0) {
    throw new InvalidArgumentException('Current group not found');
}

Puedo heredar esta excepción y crear otra excepción secundaria.

¿Cómo funciona la excepción en Perl?

Puedes usar un bloque try-catch usando Nice::Try. Nice::Try también maneja la clase de excepción, por lo que podría detectar una excepción según la clase de excepción utilizada.

- Jacques

29 de marzo de2022 a las 1:24



------------------------------------

Hay varias formas de hacerlo, pero no están integradas directamente en Perl.

La más sencilla es morir y evaluar {} para atraparlo.

eval {
  die "in a fire";
};
if ($@) {
  print "something went wrong";
}

Si quieres intentarlo, nuevamente hay varias opciones. El más común es Try::Tiny.

use Try::Tiny;

try {
  die;
} catch {
  print $_;
};

Si desea estar a la vanguardia, Paul Evans ha realizado una investigación para probar una palabra clave real en el código Perl. Ha lanzado un prototipo de esto como Syntax::Keyword::Try y ha dado varias charlas al respecto recientemente, incluso en Fosdem en 2021.

Ahora, para las excepciones reales, existen, como es típico en Perl, varias formas de hacerlo.

Puede tomar objetos como argumento en lugar de solo cadenas, por lo que puedesy prácticamente emula el comportamiento de otros lenguajes.

Probablemente lo que elegiría hoy es Throwable. Puedes crear fácilmente muchas de estas clases sobre la marcha con Throwable::Factory.

use Throwable::Factory
  InvalidArgumentException => [qw( $id )];

sub foo {
  my $group_id = shift;
  unless ($group_id) {
    InvalidArgumentException->throw('Current group not found', id => $group_id);
  }
}

Y más adelante, para captar eso, puedes hacer:

use Try::Tiny;

try {
  foo(0);
} catch {
  warn $_;
};

3

Crear clases de excepción sobre la marcha está bien, pero ¿qué pasa si quiero crear todas mis clases de excepción en un solo lugar y tenerlas disponibles en todo mi código base? Con Exception::Class, puedo definir excepciones como clases y están disponibles en todas partes.y han sido cargados en cualquier lugar. No sé cómo hacer lo mismo con Throwable::Factory.

- Dave Baird

25 de octubre de 2021 a las 7:09

@Dave, ¿puedes hacer una nueva pregunta, por favor? Lo responderé más tarde hoy. Efectivamente, creas una sola clase y usas Exportador para que las que quieras estén disponibles.

-simbabque

25 de octubre de 2021 a las 10:41

Gracias, preguntado en stackoverflow.com/questions/69729489/…

- Dave Baird

26/10/2021 a las 20:32



------------------------------------

Me gusta usar el módulo Ouch de JT Smith, especialmente para aplicaciones web. Este ejemplo combina Ouch con TryTiny

use Ouch;
use Try::Tiny;
sub ProcessFiles {    die "Help, help, I'm being repressed";    }

sub DoLotsOfStuff {
    try {
        ProcessFiles();
    } catch {
        ouch 'That module/sub gave me an err', "died: $_";
    };
}
sub Driver {
    try {
        DoLotsOfStuff();
    } catch {
        if (hug($_)) {
            ouch 404, "Driver: $_"; # the caller wants a numeric code
        }
    }
}

try {
    Driver();
} catch {
    if (kiss(404,$_)) {
        ouch 404, "CallAPI: $_";
    }
}
Compartir Seguir respondido el

5 de abril de 2021 a las 14:29

James Edwards

James Edwards

1

1

Si pasas la opción :trytiny_var mientras importas Ouch, puedes evitar todas las referencias específicas a $_ (por ejemplo, en abrazos y besos). Además, me limitaría a códigos de error enteros para el primer argumento de ouch, aunque esto es una cuestión de gusto personal.

- polettix

12 de abril de 2021 a las 5:12

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare