2009-03-19 30 views
14

Ruby có cho phép bạn xử lý cảnh báo dưới dạng lỗi không?Bạn có thể yêu cầu ruby ​​coi cảnh báo là lỗi không?

Một lý do tôi muốn làm điều này là để đảm bảo rằng nếu heckle loại bỏ một dòng mã có nghĩa là một cảnh báo xảy ra, tôi có tùy chọn đảm bảo rằng đột biến bị giết.

+0

Tôi đã gửi yêu cầu tính năng cho cờ dòng lệnh để cảnh báo ngoại lệ ... http://redmine.ruby-lang.org/issues/show/3916 –

+0

Bác sĩ RFE đã nhận được phản hồi ghi nhận rằng việc đặt $ DEBUG = true nguyên nhân "quá nhiều đối số cho chuỗi định dạng" được chuyển từ cảnh báo thành Ngoại lệ. –

+0

@TheDoctorNhững gì liên kết của bạn đã lỗi thời. Liên kết mới: https://bugs.ruby-lang.org/issues/3916 –

Trả lời

29

Có thật không may là không có cách nào thực để làm điều này, ít nhất là không trên hầu hết các phiên bản của Ruby ra khỏi đó (biến thể thể tồn tại), ngắn theo dõi chương trình đầu ra và hủy nó khi một cảnh báo xuất hiện trên sai số chuẩn . Dưới đây là lý do:

  • của Ruby định nghĩa Kernel.warn, mà bạn thể xác định lại để làm bất cứ điều gì bạn muốn (kể cả thoát), và mà bạn muốn mong đợi (hy vọng) sẽ được sử dụng một cách nhất quán của Ruby để báo cáo cảnh báo (bao gồm cả ví dụ như cảnh báo phân tích nội bộ), nhưng
  • phương pháp thực hiện natively (trong C) bên Ruby sẽ lần lượt trực tiếp gọi một phương thức bản địa gọi là rb_warn từ source/server.c, hoàn toàn bỏ qua định nghĩa lại của bạn Kernel.warn (ví dụ: các "string literal in condition" cảnh báo, ví dụ, ban hành khi làm một cái gì đó như: do_something if 'string', được in qua mẹ đẻ rb_warn từ source/parse.c)
  • để làm cho mọi việc thậm chí tệ hơn, có một bổ sung, rb_warning phương pháp tự nhiên, có thể được sử dụng bởi Ruby để ghi nhật ký nếu -w hoặc -v được chỉ định.

Vì vậy, nếu bạn cần phải hành động hoàn toàn vào cảnh báo được tạo ra bởi mã ứng dụng của bạn gọi Kernel.warn sau đó chỉ đơn giản là xác định lại Kernel.warn. Nếu không, bạn có chính xác hai lựa chọn:

  1. thay đổi source/error.c để thoát trong rb_warnrb_warning, và xây dựng lại của Ruby
  2. giám sát đầu ra sai số chuẩn của chương trình của bạn cho ': warning:', và hủy bỏ nó trên (và rb_warn_m?) trận đấu
+4

Cảm ơn bạn. Một câu trả lời có thẩm quyền nếu tôi từng thấy! –

+0

Để giám sát đầu ra lỗi chuẩn của chương trình cho ": warning:", http://stackoverflow.com/a/32941696/18096 có thể hữu ích. –

1

bạn cũng có thể có khả năng sử dụng DTrace, và đánh chặn các cuộc gọi đến và rb_warnrb_warning, mặc dù đó không phải đi để tạo ra ngoại lệ, bạn có thể giải cứu từ một nơi nào. Thay vào đó, nó sẽ chỉ đặt chúng ở đâu đó bạn có thể dễ dàng đăng nhập chúng.

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