おことわり
このスクリプトは Ruby のエラーメッセージと Exception インスタンスのメソッドとの対応 を確認するものです。そのため、 rescue 節で捕捉する例外(エラー)範囲として、最も先祖である Exception に 意図的に表記 しています。 実際に使用するときには rescue 節で捕捉する例外範囲を適切に指定してください 。
参考:
Rubyにおいて
Exceptionクラスは各種例外クラスの親クラスになっているが、その派生クラスにはInterruptも含まれる。
そのため、rescue Exceptionとした場合、ctrl+cでプログラムを停止しようとした場合にそのシグナルも捕捉されてしまい、プログラムが停止できなくなる。(そのような場合、kill -9コマンドなどでプロセスを強制停止することになる)
tips - rescue Exception を安易に使うべきではない理由 - Qiita
スクリプト
begin
  <raise error>
rescue Exception => ex
  puts ex.backtrace.first + ": #{ex.message} (#{ex.class})"
  ex.backtrace[1..-1].each { |m| puts "\tfrom #{m}" }
end
例
def err
  1 + nil
end
begin
  err
rescue Exception => ex
  puts ex.backtrace.first + ": #{ex.message} (#{ex.class})"
  ex.backtrace[1..-1].each { |m| puts "\tfrom #{m}" }
end
err
実行結果
$ ruby error.rb 
error.rb:2:in `+': nil can't be coerced into Fixnum (TypeError)
	from error.rb:2:in `err'
	from error.rb:6:in `<main>'
error.rb:2:in `+': nil can't be coerced into Fixnum (TypeError)
	from error.rb:2:in `err'
	from error.rb:12:in `<main>'
参考
##instance method
Exception#backtrace
backtrace-> [String]
バックトレース情報を返します。
デフォルトでは
- "#{sourcefile}:#{sourceline}:in `#{method}'" (メソッド内の場合)
 
- "#{sourcefile}:#{sourceline}" (トップレベルの場合)
 
という形式の String の配列です。
instance method Exception#backtrace
##instance method
Exception#message
message-> String
to_s-> String
エラーメッセージをあらわす文字列を返します。
instance method Exception#message
ちなみに
Interrupt の上位クラスには SignalException があります。
class
SignalException
クラスの継承リスト:
SignalException<Exception<Object<Kernel<BasicObject
###要約
捕捉していないシグナルを受け取ったときに発生します。
実際に発生したシグナル名は、Exception#messageから 「"SIG" + シグナル名」という形で得られます。
デフォルトの状態では、 以下のシグナルがSignalExceptionを発生させます。
SIGALRM
SIGHUP
SIGINT(※ただし以下参照)
SIGQUIT
SIGUSR1
SIGUSR2
なお、SIGINTシグナルを受けた場合はSignalExceptionの下位クラスであるInterruptが発生します。