sql >> Databáze >  >> NoSQL >> Redis

Rescue Timeout::Chyba z Redis Gem (Ruby)

Spustil jsi tento kód v irb, že? Výjimka, kterou dostáváte, není ve skutečnosti vyvolána Redis.new . Je vyvoláno inspect metoda, kterou irb volá, aby vám ukázala hodnotu výrazu, který jste právě napsali.

Stačí se podívat na stopu zásobníku (cesty jsem zkrátil, aby to bylo čitelné):

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

Jak můžete vidět výše, k výjimce dochází uvnitř inspect , nikoli Redis.new . Když zavoláte inspect na objektu Redis, místo pouhého vytištění jeho stavu, ve skutečnosti dělá spoustu věcí. V tomto případě inspect pokusí se připojit k serveru a při vypršení časového limitu vyvolá výjimku. Zdá se mi to jako velmi špatný návrh a možná bychom měli podat hlášení o chybě správcům drahokamu Redis.

To vede k zajímavému chování v IRB:

  • Zadáním Redis.new(:host => "google.com") výsledkem je výjimka, jak je uvedeno výše
  • Zadáním Redis.new(:host => "google.com"); 'hello' výsledkem je '=> "hello" '

Pokud chcete tuto výjimku zachytit, zkuste zavolat ensure_connected uvnitř vašeho počátečního/záchranného/koncového bloku.




  1. Dotaz na Mongodb na měsíc, den, rok... data a času

  2. Začínáme s ovladačem MongoDB Go Driver

  3. MongoDB:CHYBA:podřízený proces se nezdařil, ukončeno s chybou číslo 14

  4. Co je nového v MongoDB 4.2