代码之家  ›  专栏  ›  技术社区  ›  Nakilon earlonrails

如何在“case-when”中捕获Errno::ECONNRESET类?

  •  28
  • Nakilon earlonrails  · 技术社区  · 14 年前

    我的应用程序(Ruby1.9.2)可能会引发不同的异常,包括网络连接中断。我 rescue Exception => e ,然后做 case/when else

    rescue Exception => e
        p e.class
        case e.class
            when Errno::ECONNRESET
                p 1
            when Errno::ECONNRESET,Errno::ECONNABORTED,Errno::ETIMEDOUT
                p 2
            else
                p 3
        end
    end
    

    Errno::ECONNRESET
    3
    
    2 回复  |  直到 14 年前
        1
  •  55
  •   Chubas    14 年前

    这是因为 === 接线员在班上工作 Class

    这个 case 陈述 internally calls 这个 === 方法对要评估的对象执行。如果你想测试 e 同学们,你们只需要测试一下 ,不是 e.class . 那是因为 会落入 when Class 因为,好吧,e.class是一个类。

    rescue Exception => e
        case e
            when Errno::ECONNRESET
                p 1
            when Errno::ECONNRESET,Errno::ECONNABORTED,Errno::ETIMEDOUT
                p 2
            else
                p 3
        end
    end
    

    是啊,Ruby有时会有奇怪的语义

        2
  •  1
  •   Ashley Raiteri    10 年前

    例如,我不得不使用下面的case语句来实现某种类型的检测

    def fail(exception_error)
    exception = exception_error
    case exception.class
      when /HTTPClient::ConnectTimeoutError.new/
        status = 'CONNECTION TIMEOUT'
        connection_status = 'DOWN'
      else
        status = 'UNKNOWN FAILURE'
        connection_status = 'DOWN'
    end
    

    但那是因为我处理的是实际的异常类,而不是常量。 HTTPCLient正在引发实际的类对象:

    class TimeoutError < RuntimeError
    end  
    class ConnectTimeoutError < TimeoutError
    end
    

    这是一个令人费解的事实:

    error = HTTPClient::ConnectTimeoutError.new
    HTTPClient::ConnectTimeoutError === error
    #=> true
    error === HTTPClient::ConnectTimeoutError
    #=> false