require 'open-uri' require 'resolv-replace' require 'timeout' TIMEOUT = 3 begin timeout(TIMEOUT) do open(url) do |f| # Do something end end rescue TimeoutError => e # Do something on timeout rescue => e # Do something on other errors end
- Interrupt with timeout is implemented by Ruby's Thread and it is not effective againt the process implemented by C, so DNS name resolution cannot be timeout. resolv-replace overwrites the methods to use Ruby's resolve library for DNS name resolution and enables timeout.
- TimeoutError is not subclass of StandardError, so you have to catch TimeoutError explicitly.
Source: open-uriにtimeoutを設定する方法 | やむにやまれず