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 のサブクラスである全ての例外を捕捉します。