Изящно выход из нити в Ruby - PullRequest
3 голосов
/ 21 марта 2010

Я пробую Mongrel и использую следующий код:

require 'rubygems'
require 'mongrel'

class SimpleHandler < Mongrel::HttpHandler
    def process(request, response)
        response.start(200) do |head, out|
            head["Content-Type"] = "text/plain"
            out.write("Hello World!\n")
        end
    end
end

h = Mongrel::HttpServer.new("0.0.0.0", "3000")
h.register("/test", SimpleHandler.new)
puts "Press Control-C to exit"
h.run.join

trap("INT") do
    puts "Exiting..."
end

По сути, это просто выводит "Hello World!" когда я иду на localhost: 3000 / тест. Он отлично работает, и я могу закрыть программу с помощью Control-C. Но когда я нажимаю Control-C, это выводится:

my_web_server.rb:17:in `join': Interrupt
from my_web_server.rb:17

Итак, я попытался поместить это утверждение trap("INT") в конце, но оно не вызывается. Решение

Спасибо.

1 Ответ

8 голосов
/ 21 марта 2010

Нет необходимости перехватывать INT, если все, что вы хотите сделать, это выйти без трассировки стека.Элемент управления c вызывает исключение «прерывание».Поэтому, чтобы позволить вашей программе завершить работу на control-C без уродливой трассировки стека, перехватите это исключение:

...