Подтвердить что ты не робот

Как правильно использовать попытку catch в perl, которую предоставляет error.pm?

Я обнаружил, что есть модуль Error, который обеспечивает функции try и catch, такие как java. Но я смущен тем, как вы можете распечатать возвращаемое исключение.

Я хотел бы понять, как сделать следующее

try {
    // do something that will fail!

} catch (Error e) {
    // Print out the exception that occurred
    System.out.println(e.getMessage());
}

Как получить распечатку ошибки с трассировкой стека?

4b9b3361

Ответ 1

Вероятно, вам лучше использовать Try:: Tiny, который поможет вам избежать ряда ловушек со старыми perl s.

use Try::Tiny;

try {
        die "foo";
} catch {
        warn "caught error: $_";
};

Ответ 2

Последнее, что я проверил, Error устарел. Но вот как бы вы сделали это без этого модуля:

eval {
    die "Oops!";
    1;
} or do {
    my $e = [email protected];
    print("Something went wrong: $e\n");
};

В основном используйте eval вместо try, die вместо throw, и найдите исключение в [email protected]. Истинное значение в конце блока eval является частью идиомы, чтобы предотвратить непреднамеренное изменение [email protected] до его повторного использования в версиях Perl старше 5.14, см. P:: C:: P:: ErrorHandling:: RequireCheckingReturnValueOfEval. Например, этот код страдает от этого недостатка.

# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14
eval {
    die "Oops!";
};
if (my $e = [email protected]) {
    print("Something went wrong: $e\n");
}
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14

Но обратите внимание, что многие операции Perl не вызывают исключения, когда они терпят неудачу; они просто возвращают код ошибки. Это поведение можно изменить с помощью autodie для встроенных и стандартных модулей. Если вы используете autodie, тогда стандартный способ делать try/catch - это (прямо из autodie perldoc):

use feature qw(switch);

eval {
   use autodie;

   open(my $fh, '<', $some_file);

   my @records = <$fh>;

   # Do things with @records...

   close($fh);

};

given ([email protected]) {
   when (undef)   { say "No error";                    }
   when ('open')  { say "Error from open";             }
   when (':io')   { say "Non-open, IO error.";         }
   when (':all')  { say "All other autodie errors."    }
   default        { say "Not an autodie error at all." }
}

Чтобы получить стек, посмотрите Carp.

Ответ 3

Если вам нужно что-то более мощное, чем Try:: Tiny, вы можете попробовать посмотреть модуль TryCatch в CPAN.