복붙노트

[REDIS] 구조 제한 시간 : 레디 스 보석의 오류 (루비)

REDIS

구조 제한 시간 : 레디 스 보석의 오류 (루비)

나는 상기 레디 스 라이브러리에서 제기 타임 아웃 :: 오류를 구출해야하지만 난 작동하지 않는 특정 클래스를 구출, 문제가 실행 해요.

begin
  Redis.new( { :host => "127.0.0.X" } )
rescue Timeout::Error => ex
end

=> Timeout::Error: Timeout::Error from /Users/me/.rvm/gems/ree-1.8.7-2011.03@gowalla/gems/redis-2.2.0/lib/redis/connection/hiredis.rb:23:in `connect'

내가 구조 예외로 할 때 그것은 여전히 ​​작동하지 않습니다

begin
  Redis.new( { :host => "127.0.0.X" } )
rescue Exception => ex
end

=> Timeout::Error: Timeout::Error from /Users/me/.rvm/gems/ree-1.8.7-2011.03@gowalla/gems/redis-2.2.0/lib/redis/connection/hiredis.rb:23:in `connect'

내가 수동으로 예외를 발생하려고하면, 나는 그것을 구출 할 수 있지만 그것이 레디 스 보석 (2.2.0) 내에서 호출 때 내가 그것을 구할 수없는 이유를 모르겠어요.

begin
  raise Timeout::Error
rescue Timeout::Error => ex
  puts ex 
end

Timeout::Error
=> nil 

모든 단서는 방법이 예외를 구출하기 위해?

해결법

  1. ==============================

    1.당신은 바로 IRB에서이 코드를 실행? 당신은 점점 예외 실제로 Redis.new에 의해 제기되지 않습니다. 그것은 IRB 통화가 당신에게 당신이 방금 입력 한 식의 값을 표시 할 수있는 검사 방법에 의해 제기되고있다.

    당신은 바로 IRB에서이 코드를 실행? 당신은 점점 예외 실제로 Redis.new에 의해 제기되지 않습니다. 그것은 IRB 통화가 당신에게 당신이 방금 입력 한 식의 값을 표시 할 수있는 검사 방법에 의해 제기되고있다.

    그냥 스택 트레이스를 보면 (나는 그것을 읽을 수 있도록 경로를 단축) :

    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
    

    위에서 볼 수 있듯이, 예외는 내부 Redis.new을하지 검사 발생합니다. 당신은 실제로 많은 것들을 않는 대신 자신의 상태를 인쇄하는하는 레디 스 객체에 검사를 호출합니다. 이 경우, 서버에 연결하려는 시도를 검사하고 그 시간이 초과 예외가 발생합니다. 이것은 나에게 아주 나쁜 디자인처럼 보인다 어쩌면 우리는 레디 스 보석의 관리자들에 대한 버그 리포트를 제출해야한다.

    IRB에서 몇 가지 흥미로운 행동이 리드 :

    이 예외를 캐치 할 경우, 시작 / 구조 / 엔드 블록 내부에 ensure_connected 부르심보십시오.

  2. from https://stackoverflow.com/questions/7035054/rescue-timeouterror-from-redis-gem-ruby by cc-by-sa and MIT license