Anda menjalankan kode ini di irb, bukan? Pengecualian yang Anda dapatkan sebenarnya tidak diajukan oleh Redis.new
. Itu dimunculkan oleh inspect
metode, yang dipanggil irb untuk menunjukkan nilai ekspresi yang baru saja Anda ketik.
Lihat saja jejak tumpukan (saya mempersingkat jalur agar mudah dibaca):
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
Seperti yang Anda lihat di atas, pengecualian terjadi di dalam inspect
, bukan Redis.new
. Saat Anda memanggil inspect
pada objek Redis, alih-alih hanya mencetak statusnya, ia sebenarnya melakukan banyak hal. Dalam hal ini, inspect
mencoba terhubung ke server dan mengeluarkan pengecualian saat waktu itu habis. Ini sepertinya desain yang sangat buruk bagi saya dan mungkin kita harus mengajukan laporan bug ke pengelola permata Redis.
Ini mengarah pada beberapa perilaku menarik di IRB:
- Mengetik
Redis.new(:host => "google.com")
menghasilkan pengecualian seperti yang ditunjukkan di atas - Mengetik
Redis.new(:host => "google.com"); 'hello'
menghasilkan '=> "hello"
'
Jika Anda ingin mengetahui pengecualian ini, coba panggil ensure_connected
di dalam blok awal/penyelamatan/akhir Anda.