sql >> Database >  >> NoSQL >> Redis

Rescue Time-out::Fout van Redis Gem (Ruby)

Je hebt deze code in irb uitgevoerd, toch? De uitzondering die je krijgt, wordt niet echt gemaakt door Redis.new . Het wordt opgehaald door de inspect methode, die irb aanroept om u de waarde te tonen van de uitdrukking die u zojuist hebt getypt.

Kijk maar naar de stacktracering (ik heb de paden ingekort om het leesbaar te maken):

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

Zoals je hierboven kunt zien, vindt de uitzondering plaats binnen inspect , niet Redis.new . Wanneer je inspect belt op een Redis-object, in plaats van alleen de staat af te drukken, doet het eigenlijk veel dingen. In dit geval inspect probeert verbinding te maken met de server en genereert een uitzondering wanneer die time-out optreedt. Dit lijkt me een heel slecht ontwerp en misschien moeten we een bugrapport indienen bij de beheerders van de Redis-edelsteen.

Dit leidt tot interessant gedrag in IRB:

  • Typen Redis.new(:host => "google.com") resulteert in een uitzondering zoals hierboven weergegeven
  • Intypen van Redis.new(:host => "google.com"); 'hello' resulteert in '=> "hello" '

Als je deze uitzondering wilt opvangen, bel dan ensure_connected in je begin-/reddings-/eindblok.




  1. MongoDB $cos

  2. Mongodb-query specifieke maand|jaar niet datum

  3. Verzamelobject kan niet worden opgeroepen fout met PyMongo

  4. Node mangoest zoekquery in lus werkt niet