如何在"case when"中捕获Errno :: ECONNRESET类?

Nak*_*lon 29 ruby exception-handling case errno

我的应用程序(Ruby 1.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
Run Code Online (Sandbox Code Playgroud)

打印:

Errno::ECONNRESET
3
Run Code Online (Sandbox Code Playgroud)

Chu*_*bas 51

这是因为===操作员在课堂上的工作方式Class

case语句在内部调用===您正在评估的对象上的方法.如果你想测试e课程,你只需要测试e,而不是e.class.这是因为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
Run Code Online (Sandbox Code Playgroud)

是的,Ruby有时可能会有奇怪的语义

  • 是的,很奇怪.1 === 1 =>真.数组=== Array => false. (4认同)
  • 当然,现在它是有道理的.在你要比较的元素上调用`===`.所以`Class === Array`,`String ==="foobar"`和`/ foo/==="foobar"`都返回true. (4认同)