LoginSignup
11
8

More than 5 years have passed since last update.

エラーをrescueして、rescueしない場合と全く同じエラーメッセージを出力する

Last updated at Posted at 2015-04-03

おことわり

このスクリプトは 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

error.rb
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 が発生します。

11
8
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8