Error matchers in Ruby

Sunny

https://github.com/sunny https://twitter.com/sunfox https://sunfox.org

Cults.

La place de marché dédiée à l’impression 3d

https://cults3d.com

! Fail !

Exceptions

def call(order)

do something…

rescue Net::OpenTimeout, Net::ReadTimeout try_again_later(order) end

Exceptions

def call(order)

do something…

rescue Net::OpenTimeout, Net::ReadTimeout try_again_later(order) rescue Faraday::ConnectionFailed => error if error.message == “execution expired” try_again_later(order) end end

=== matcher in Ruby

module FaradayTimeoutErrorMatcher def self.===(error) error.is_a?(Faraday::ConnectionFailed) && error.message == “execution expired” end end

🎉

def call(order)

do something…

rescue Net::OpenTimeout, Net::ReadTimeout, FaradayTimeoutErrorMatcher try_again_later(order) end

module NetworkTimeoutErrorMatcher def self.===(error) case error when Faraday::ConnectionFailed error.message == “execution expired” when Net::OpenTimeout, Net::ReadTimeout true end end end

🎉🎉🎉

def call(order)

do something…

rescue NetworkTimeoutErrorMatcher try_again_later(order) end

Retriable gem

def call(order) retriable(on: NetworkTimeoutErrorMatcher) do # do something… end end