2010-03-21 5 views
3

Je suis d'essayer Mongrel et en utilisant le code suivant: « Bonjour tout le monde »sortant Gracieusement de fil dans Ruby

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 

Fondamentalement, cela se contente d'afficher quand je vais à localhost: 3000/test. Cela fonctionne bien, et je peux fermer le programme avec Control-C. Mais quand j'appuyez sur Ctrl-C, cela devient émis:

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

J'ai essayé de mettre cette déclaration trap("INT") à la fin, mais il est pas appelé. Solution?

Merci.

Répondre

7

Il n'est pas nécessaire de piéger INT si tout ce que vous voulez faire est de quitter sans la trace de la pile. Un contrôle-c provoque une exception "Interruption". Donc, pour laisser votre programme quitter le contrôle-C sans la trace de la pile laide, attraper cette exception:

begin 
    ... # do stuff 
rescue Interrupt 
    puts "Exiting..." 
end