sql >> Database teknologi >  >> NoSQL >> Redis

Rescue Timeout::Fejl fra Redis Gem (Ruby)

Du kørte denne kode i irb, ikke? Den undtagelse, du får, bliver faktisk ikke rejst af Redis.new . Det bliver rejst af inspect metode, som irb kalder for at vise dig værdien af ​​det udtryk, du lige har skrevet.

Bare se på stak-sporet (jeg forkortede stierne for at gøre det læseligt):

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

Som du kan se ovenfor, forekommer undtagelsen inde i inspect , ikke Redis.new . Når du ringer til inspect på et Redis-objekt, i stedet for blot at udskrive dets tilstand, gør det faktisk en masse ting. I dette tilfælde skal du inspect forsøger at oprette forbindelse til serveren og kaster en undtagelse, når det timeout. Dette virker som et meget dårligt design for mig, og måske skal vi indsende en fejlrapport til vedligeholderne af Redis-perlen.

Dette fører til noget interessant adfærd i IRB:

  • Skriv Redis.new(:host => "google.com") resulterer i en undtagelse som vist ovenfor
  • Skriv Redis.new(:host => "google.com"); 'hello' resulterer i '=> "hello" '

Hvis du vil fange denne undtagelse, kan du prøve at ringe til ensure_connected inde i din start-/rednings-/slutblok.




  1. En tjekliste for udvikling og drift for MongoDB

  2. $projekt i $lookup mongodb

  3. Hvilke parametre overføres til Mongoose-tilbagekald

  4. Slaget om NoSQL-databaserne - Sammenligning af MongoDB &MSSQL's NoSQL-funktioner