Ostatnio sprawdziłem, Error został wycofany. Ale oto w jaki sposób to zrobić bez tego modułu:
eval {
die "Oops!";
1;
} or do {
my $e = [email protected];
print("Something went wrong: $e\n");
};
Zasadniczo użyć eval zamiast try
, die zamiast throw
i szukać wyjątkiem w [email protected]
. Prawdziwa wartość na końcu bloku eval jest częścią idiomu, aby zapobiec niezamierzonej zmianie [email protected]
przed ponownym użyciem w wersjach Perla starszych niż 5.14, patrz: P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval w celu uzyskania szczegółowych informacji. Na przykład kod ten cierpi z powodu tej wady.
# 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
Należy jednak pamiętać, że wiele operacji Perl nie podnieść wyjątki, gdy nie uda; po prostu zwracają kod błędu. To zachowanie można zmienić poprzez autodie dla wbudowanych i standardowych modułów. Jeśli używasz autodie
, to standardowy sposób robi try/catch jest to (prosto z perldoc autodie):
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." }
}
Dla uzyskania StackTrace, spojrzeć na Carp.
Jak zrzucić to ostrzeżenie do dzienników? – pitchblack408
Czy mogę tworzyć wyjątki? – pitchblack408
Nie jestem pewien, o co prosisz. Zrzuca pliki do logów, logując je i tworzysz wyjątki za pomocą 'die' lub' croak'. Czy pytasz, jak zestawiać obiekty wyjątków itp.? To byłoby osobne pytanie. –