Bạn đã chạy mã này trong irb, phải không? Ngoại lệ bạn đang nhận được không thực sự được nêu ra bởi Redis.new
. Nó đang được nâng lên bởi inspect
phương thức mà irb gọi để hiển thị cho bạn giá trị của biểu thức bạn vừa nhập.
Chỉ cần nhìn vào dấu vết ngăn xếp (tôi đã rút ngắn các đường dẫn để làm cho nó dễ đọc):
ruby-1.8.7-p330 :009 > Redis.new(:host => "google.com")
Timeout::Error: time's up!
from /.../SystemTimer-1.2.3/lib/system_timer/concurrent_timer_pool.rb:63:in `trigger_next_expired_timer_at'
from /.../SystemTimer-1.2.3/lib/system_timer/concurrent_timer_pool.rb:68:in `trigger_next_expired_timer'
from /.../SystemTimer-1.2.3/lib/system_timer.rb:85:in `install_ruby_sigalrm_handler'
from /..../lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /.../SystemTimer-1.2.3/lib/system_timer.rb:83:in `install_ruby_sigalrm_handler'
from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `call'
from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `initialize'
from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `new'
from /.../redis-2.2.2/lib/redis/connection/ruby.rb:26:in `connect'
from /.../SystemTimer-1.2.3/lib/system_timer.rb:60:in `timeout_after'
from /.../redis-2.2.2/lib/redis/connection/ruby.rb:115:in `with_timeout'
from /.../redis-2.2.2/lib/redis/connection/ruby.rb:25:in `connect'
from /.../redis-2.2.2/lib/redis/client.rb:227:in `establish_connection'
from /.../redis-2.2.2/lib/redis/client.rb:23:in `connect'
from /.../redis-2.2.2/lib/redis/client.rb:247:in `ensure_connected'
from /.../redis-2.2.2/lib/redis/client.rb:137:in `process'
... 2 levels...
from /.../redis-2.2.2/lib/redis/client.rb:46:in `call'
from /.../redis-2.2.2/lib/redis.rb:90:in `info'
from /..../lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /.../redis-2.2.2/lib/redis.rb:89:in `info'
from /.../redis-2.2.2/lib/redis.rb:1075:in `inspect'
from /..../lib/ruby/1.8/monitor.rb:242:in `synchronize'
from /.../redis-2.2.2/lib/redis.rb:1074:in `inspect'
from /..../lib/ruby/1.8/irb.rb:310:in `output_value'
from /..../lib/ruby/1.8/irb.rb:159:in `eval_input'
from /..../lib/ruby/1.8/irb.rb:271:in `signal_status'
from /..../lib/ruby/1.8/irb.rb:155:in `eval_input'
from /..../lib/ruby/1.8/irb.rb:154:in `eval_input'
from /..../lib/ruby/1.8/irb.rb:71:in `start'
from /..../lib/ruby/1.8/irb.rb:70:in `catch'
from /..../lib/ruby/1.8/irb.rb:70:in `start'
from /..../bin/irb:17
Như bạn có thể thấy ở trên, ngoại lệ xảy ra bên trong inspect
, không phải Redis.new
. Khi bạn gọi inspect
trên một đối tượng Redis, thay vì chỉ in ra trạng thái của nó, nó thực sự làm rất nhiều thứ. Trong trường hợp này, inspect
cố gắng kết nối với máy chủ và ném một ngoại lệ khi điều đó hết thời gian. Đây có vẻ là một thiết kế rất tệ đối với tôi và có lẽ chúng tôi nên gửi báo cáo lỗi cho những người bảo trì viên ngọc Redis.
Điều này dẫn đến một số hành vi thú vị trong IRB:
- Đang nhập
Redis.new(:host => "google.com")
dẫn đến một ngoại lệ như được hiển thị ở trên - Đang nhập
Redis.new(:host => "google.com"); 'hello'
kết quả là '=> "hello"
'
Nếu bạn muốn biết ngoại lệ này, hãy thử gọi ensure_connected
bên trong khối bắt đầu / giải cứu / kết thúc của bạn.