Rubyのnet/httpでファイルをダウンロードする時に確実に例外を捕捉するには
いつも解決法を忘れて、同じ失敗をするので、備忘録を兼ねてメモ。次のように書く。
require 'net/http' Net::HTTP.version_1_2 begin Net::HTTP.start('www.example.com', 80) {|http| response = http.get('/index.html') puts response.body } rescue Exception => e #例外処理 end
rescue節で、明示的にExceptionを指定しないと、Timeout例外が発生した時に例外を捕捉できない。これは、Timeout例外がStandardErrorのサブクラスではないため。
プログラミング言語 Ruby リファレンスマニュアルより引用。
例外の一致判定は例外のクラスが rescue 節で指定したクラスと同じかまたはサブクラスであるかどうか Object#kind_of? を用いて判定されます。
error_type が省略された時は StandardError のサブクラスである全ての例外を捕捉します。