sql >> Databasteknik >  >> NoSQL >> Redis

Rescue Timeout::Fel från Redis Gem (Ruby)

Du körde den här koden i irb, eller hur? Undantaget du får är faktiskt inte höjt av Redis.new . Den höjs av inspect metod, som irb anropar för att visa dig värdet på uttrycket du precis skrev.

Titta bara på stackspåret (jag förkortade vägarna för att göra det läsbart):

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 ovan inträffar undantaget i inspect , inte Redis.new . När du ringer inspect på ett Redis-objekt, istället för att bara skriva ut dess tillstånd, gör det faktiskt många saker. I det här fallet inspect försöker ansluta till servern och gör ett undantag när det tar slut. Det här verkar vara en väldigt dålig design för mig och vi kanske borde lämna in en felrapport till underhållarna av Redis pärla.

Detta leder till ett intressant beteende i IRB:

  • Skriver Redis.new(:host => "google.com") resulterar i ett undantag som visas ovan
  • Skriv Redis.new(:host => "google.com"); 'hello' resulterar i '=> "hello" '

Om du vill fånga detta undantag, försök att ringa ensure_connected inuti ditt start-/räddnings-/slutblock.




  1. Hur använder man redis 'DUMP' och 'RESTORE' (offline)?

  2. redis bgsave misslyckades eftersom gaffeln inte kan allokera minne

  3. Python Redis interaktion

  4. Hur visar jag base64-bilden i reager?