2011-10-02 10 views
7

Tôi có một máy chủ EventMachine mà tôi đang theo dõi bằng monit. Đôi khi nó đổ vỡ, và tôi đang cố gắng tìm ra lý do tại sao, nhưng nó không rõ ràng với tôi như thế nào tôi chỉ có thể đăng nhập tất cả các thất bại cấp cao nhất. Tôi đã thử mã như sau:Làm thế nào để bắt lỗi cấp cao nhất trên máy chủ EventMachine?

begin 
    EventMachine::run do 
    EventMachine::start_server('0.0.0.0', PORT, MyServer) 
    end 
rescue Exception => e 
    puts "FAILURE: #{e.class}: #{e}" 
end 

nhưng dường như không bao giờ gặp lỗi. Tôi nghi ngờ nó có thể là một cái gì đó như chạy ra khỏi bộ nhớ, mà tôi đang theo dõi riêng, nhưng tôi vẫn muốn máy chủ này để đăng nhập nguyên nhân gần đúng của sự thất bại nếu có thể.

Trả lời

15

Nếu bạn muốn một trình xử lý lỗi bắt tất cả, hãy thử EM.error_handler. Ví dụ từ docs:

EM.error_handler{ |e| 
    puts "Error raised during event loop: #{e.message}" 
} 

Bạn cũng có thể muốn biết thêm xử lý lỗi hạt mịn, trong trường hợp mà bạn có thể sử dụng cơ chế errback (xem Deferrable). Vì vậy, ví dụ bạn có thể có trong vòng lặp lò phản ứng của bạn:

EventMachine::run do 
    server = EventMachine::start_server('0.0.0.0', PORT, MyServer) 
    server.errback { # handle error thrown by server here } 
end 

Đối với điều này để làm việc, include Deferrable trong myserver của bạn, sau đó bất cứ khi nào bạn muốn nâng cao một lỗi, hãy gọi fail.