Rubyで例外を捕捉する
例外を捕捉して処理を続行する場合
もっとも単純な構文
begin
# 例外が起きうる処理
rescue
# 例外が発生した場合の処理
end
例外オブジェクトから情報を取得する
Rubyでは発生した例外もオブジェクトであるため、例外オブジェクトのメソッドを呼び出すことで、発生した例外に関する情報を取得することができる。代表的なものとして例外発生時のエラーメッセージを返すmessageメソッドとメソッド呼び出し履歴を配列で返すbacktraceメソッドがある。
こんな感じの構文
begin
# 例外が起きうる処理
rescue => 例外オブジェクトを格納する変数(e,exがよく使われる)、捕捉したい例外クラス
# 例外が発生した場合の処理
end
具体例
begin
1 / 0
rescue => e
puts "エラークラス: #{e.class}"
puts "エラーメッセージ: #{e.message}"
puts "バックトレース ----"
puts e.backtrace
puts "----"
end
#こんなエラーが帰ってくる
エラークラス: ZeroDivisionError
エラーメッセージ: divided by 0
バックトレース ----
(irb):2:in '/'
(irb):2:in 'irb_binding'
省略/irb:11:in '<main>'
例外クラスの継承関係
Rubyではすべての例外クラスはExceptionクラスを継承している。その下にたくさんのサブクラスがぶら下がっている。ここで重要になるのがExceptionクラスの下にあるStandardErrorとそれ以外の例外クラスの違いを理解すること。
StandardErrorは通常のプログラムで発生する可能性の高い例外を表すクラスです。これのサブクラスとしてNoMethodErrorやZeroDivisionError、StandardErrorクラスが含まれている。
StandardErrorクラスを継承していないものは、通常のプログラムでは発生しない特殊なエラーが起きていることを表す。
rescue節に何もクラスを指定しなかった場合に捕捉されるのはStandardErrorとそのサブクラスです。StandardErrorを継承していない例外クラスは捕捉されない。
begin
# 例外が起きそうな処理
rescue
# StandardErrorとそのサブクラスのみ捕捉される
end
Author And Source
この問題について(Rubyで例外を捕捉する), 我々は、より多くの情報をここで見つけました https://qiita.com/sumin/items/a09af4478b1576e62281著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .