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:
- thay đổi
source/error.c
để thoát trong rb_warn
và rb_warning
, và xây dựng lại của Ruby
- 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
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 –
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ệ. –
@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 –