Cuối cùng tôi đã chọn, Error không được chấp nhận. Nhưng đây là cách bạn sẽ làm điều đó mà không cần đun rằng:
eval {
die "Oops!";
1;
} or do {
my $e = [email protected];
print("Something went wrong: $e\n");
};
Về cơ bản, sử dụng eval thay vì try
, die thay vì throw
, và tìm kiếm các ngoại lệ trong [email protected]
. Giá trị thực sự ở cuối khối eval là một phần của thành ngữ để ngăn chặn [email protected]
không chủ ý thay đổi trước khi được sử dụng lại trong các phiên bản Perl cũ hơn 5.14, xem P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval để biết chi tiết. Ví dụ, mã này bị lỗ hổng này.
# 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
Nhưng lưu ý rằng nhiều hoạt động Perl không tăng ngoại lệ khi họ thất bại; họ chỉ cần trả về một mã lỗi. Hành vi này có thể được thay đổi thông qua autodie đối với nội trang dựng sẵn và mô-đun chuẩn. Nếu bạn đang sử dụng autodie
, thì cách làm tiêu chuẩn của try/catch là này (thẳng ra khỏi 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." }
}
Để nhận được một stacktrace, nhìn vào Carp.
Nguồn
2012-04-26 23:57:14
Làm thế nào tôi sẽ đưa cảnh báo này vào nhật ký? – pitchblack408
Tôi có thể tạo ngoại lệ không? – pitchblack408
Tôi không chắc chắn những gì bạn đang yêu cầu. Bạn đổ những thứ trong các tệp nhật ký bằng cách ghi chúng và bạn tạo các ngoại lệ bằng cách sử dụng 'die' hoặc' croak'. Bạn đang hỏi làm thế nào để đặt cùng các đối tượng ngoại lệ vv? Đó sẽ là một câu hỏi riêng. –