2013-10-29 15 views
11

Perl hiện đang thực hiện $SIG{__DIE__} theo cách sao cho nó sẽ phát hiện bất kỳ lỗi nào xảy ra, ngay cả bên trong các khối eval. Điều này có một thuộc tính thực sự hữu ích mà bạn có thể tạm dừng mã tại điểm chính xác nơi xảy ra lỗi, thu thập một dấu vết ngăn xếp của lỗi thực tế, bọc nó lên trong một đối tượng, và sau đó gọi chết thủ công với đối tượng này làm tham số.Nhận các lỗi thời gian chạy trong Perl và chuyển đổi sang ngoại lệ

Việc lạm dụng số $SIG{__DIE__} này không còn được dùng nữa. Chính thức, bạn phải thay thế $SIG{__DIE__} bằng *CORE::GLOBAL::die. Tuy nhiên, hai số này là KHÔNG tương đương từ xa. *CORE::GLOBAL::dieNOT được gọi khi xảy ra lỗi thời gian chạy! Tất cả những gì nó làm là thay thế các cuộc gọi rõ ràng thành die().

Tôi không quan tâm đến việc thay thế khuôn.

Tôi đặc biệt quan tâm đến việc bắt lỗi thời gian chạy.

Tôi cần đảm bảo rằng mọi lỗi thời gian chạy, trong bất kỳ chức năng nào, ở bất kỳ độ sâu nào, trong bất kỳ mô-đun nào, khiến Perl chuyển quyền kiểm soát cho tôi để tôi có thể thu thập dấu vết ngăn xếp và phục hồi lại. Điều này cần phải làm việc bên trong một khối eval - một hoặc nhiều khối eval kèm theo có thể muốn bắt ngoại lệ, nhưng lỗi thời gian chạy có thể ở trong một hàm không có eval kèm theo, bên trong bất kỳ mô-đun nào, từ bất kỳ đâu.

$SIG{__DIE__} hỗ trợ điều này một cách hoàn hảo — và đã phục vụ tôi một cách trung thực trong vài năm trở lên — nhưng Quyền hạn được cảnh báo rằng cơ sở tuyệt vời này có thể bị giật bất cứ lúc nào và tôi không muốn một điều bất ngờ khó chịu một ngày xuống dòng. Lý tưởng, đối với chính Perl, họ có thể tạo ra một tín hiệu mới $SIG{__RTMERR__} cho mục đích này (tín hiệu chuyển đổi đủ dễ dàng, dù sao thì tôi cũng chỉ vì nó chỉ được nối ở một nơi). Thật không may, sức mạnh thuyết phục của tôi sẽ không dẫn đến một người nghiện rượu để mở một cái chai, vì vậy giả sử điều này sẽ không xảy ra, chính xác thì người ta phải đạt được mục đích này để bắt kịp các lỗi thời gian chạy là gì?

(Ví dụ: một câu trả lời khác ở đây đề xuất Cá chép :: Luôn luôn, cái nào… cũng móc DIE!)

Trả lời

3

Chỉ cần thực hiện. Tôi đã làm xong. Có lẽ tất cả mọi người biết về móc này đã làm được.

Đó là Perl; nó vẫn tương thích trở lại hàng thập kỷ. Tôi giải thích "không được chấp nhận" ở đây có nghĩa là "xin vui lòng không sử dụng này nếu bạn không cần nó, ew, tổng". Nhưng bạn cần nó, và dường như hiểu được hàm ý, vì vậy imo đi cho nó. Tôi nghiêm túc nghi ngờ một tính năng ngôn ngữ không thể thay thế sẽ biến mất bất cứ lúc nào sớm.

Và phát hành tác phẩm của bạn trên CPAN để người phát triển tiếp theo không cần phải tái tạo lại điều này. :)

+0

Nó không được sử dụng trong nhiều năm, nhưng cho đến nay, không có thay thế nào được nêu. Điều này có nghĩa là nó không bị phản đối, hoặc rằng họ không có ý định giữ lại chức năng, hoặc rằng họ đã bỏ qua một cách đơn giản để đưa ra cách tiếp cận chính xác. Bạn không thể từ chối điều gì đó quan trọng nếu đó là cách duy nhất để đạt được điều gì đó! Có lẽ họ sẽ không ... –

+3

Theo [tìm kiếm trên grep.cpan.me] (http://grep.cpan.me/?q=__DIE__ [% 27% 22]% 3F \} + *% 3D) "hơn 1000 bản phân phối" đang sử dụng '$ SIG {__ DIE __}'. Tôi không nghĩ rằng nó sẽ đi ... –

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