Как отловить класс Errno :: ECONNRESET в «случае, когда»?

Мое приложение (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

Печать:

Errno::ECONNRESET
3
 Andy Triggs03 февр. 2015 г., 15:33
Спасите свои классы ошибок в мультиспасительном блоке, и тогда вы сможете полностью избежать оператора case.

Ответы на вопрос(1)

Решение Вопроса

=== оператор работает на уроке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

Да, у Руби иногда может быть странная семантика

 Kris07 сент. 2011 г., 17:57
Обратите внимание, что ни один из примеров не работает в Ruby 1.8.7
 Nakilon27 сент. 2010 г., 09:00
Да странно 1 === 1 => правда. Array === Array => false.
 Chubas27 сент. 2010 г., 09:06
Э-э. Готов поспоритьArray === Class дал бы правду, но теперь я в замешательстве. Благодаря вашему комментарию теперь я не могу спать: /
 Chubas27 сент. 2010 г., 20:11
Конечно, теперь это имеет смысл.=== вызывается для элемента, с которым вы сравниваете. ТакClass === Array, String === "foobar" а также/foo/ === "foobar" все возвращают истину.

Ваш ответ на вопрос