Ответ 1
Вероятно, вам лучше использовать Try:: Tiny, который поможет вам избежать ряда ловушек со старыми perl
s.
use Try::Tiny;
try {
die "foo";
} catch {
warn "caught error: $_";
};
Я обнаружил, что есть модуль Error, который обеспечивает функции try и catch, такие как java. Но я смущен тем, как вы можете распечатать возвращаемое исключение.
Я хотел бы понять, как сделать следующее
try {
// do something that will fail!
} catch (Error e) {
// Print out the exception that occurred
System.out.println(e.getMessage());
}
Как получить распечатку ошибки с трассировкой стека?
Вероятно, вам лучше использовать Try:: Tiny, который поможет вам избежать ряда ловушек со старыми perl
s.
use Try::Tiny;
try {
die "foo";
} catch {
warn "caught error: $_";
};
Последнее, что я проверил, 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.
Если вам нужно что-то более мощное, чем Try:: Tiny, вы можете попробовать посмотреть модуль TryCatch в CPAN.