#おことわり
このスクリプトは 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
が発生します。