2009-04-10 23 views
23

Trong Perl, có cách nào để buộc tất cả các lỗi nghiêm trọng để hiển thị một backtrace ngăn xếp như Carp::confess sản xuất?Làm thế nào để buộc một backtrace ngăn xếp cho tất cả các lỗi nghiêm trọng trong Perl?

Tôi biết bạn có thể làm use warnings FATAL => 'all'; để cảnh báo gây tử vong trong phạm vi từ vựng hiện tại.

Hơn nữa, bạn có thể sử dụng $SIG{__WARN__} = sub { CORE::die(@_) }; để thực hiện tất cả cảnh báo gây tử vong ở mọi nơi (chưa bản địa hóa trình xử lý SIGWARN).

Có cách nào hay không để thực hiện việc này hoặc tôi có cần tinh chỉnh SIGDIE không? Và nếu tôi viết một trình xử lý SIGDIE, cách tốt nhất để lấy dấu vết là gì?

Giải pháp lý tưởng sẽ hoạt động với thư viện kiểm tra chuẩn, Test::More và bạn bè.

Cập nhật: Mark Johnson đề xuất sử dụng trình xử lý SIGDIE để gọi Carp::confess. Nó hoạt động độc đáo. Đây là mã:

use Carp; 
$SIG{ __DIE__ } = sub { Carp::confess(@_) }; 
+0

Câu hỏi tương tự, câu trả lời khác: [Làm thế nào tôi có thể thay thế tất cả 'xác nhận' bằng 'thú nhận' trong ứng dụng Perl?] (Http://stackoverflow.com/q/1877638/269126) – Lumi

Trả lời

16

Cài đặt trình xử lý SIGDIE gọi Carp :: thú nhận? Hoặc chỉ cần thiết lập Carp :: thú nhận là xử lý cho DIE?

Hãy coi chừng standard gotchas liên quan đến eval. Thậm chí còn có weirder gotcha đối với các khối BEGIN. Cũng lưu ý số ominous warning in perlvar.

Xem this question để biết thêm thông tin về cách tạo ngăn xếp ngăn xếp.

+0

Tôi không biết tại sao tôi không nghĩ về nó. Nó hoạt động. – daotoad

11

Xem thêm mô-đun "Carp::Always", tất cả đều biến mất và cảnh báo trong mã của bạn thành stacktraces.

Các vấn đề liên quan