今日の教科書
エラーメッセージ
#エラーメッセージ
ファイル名:行番号:in `メソッド名`: エラーメッセージ(例外の種類)
from メソッドを呼び出した位置
test.rb:3:in `+': String can't be coerced into Fixnum (TypeError)
from test.rb:3
#例外処理
begin
<例外が起こる可能性のある処理>
rescue => <例外オブジェクトが代入される変数>
<例外が起こった場合の処理>
end
month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
wrong_number = [0, 1, 2, 3, 4, 5,
"6", "7", 8, 9, 10, 11]
wrong_number.each do |num|
begin
puts month[num]
rescue
next
end
end
例外オブジェクトのメソッドで例外の情報を知る。
class:例外の種類
message:例外のメッセージ
backtrace:例外の発生した位置に関する情報
##後処理
例外が起こらない場合でも実行したい処理がある場合
begin
<例外を発生させる可能性のある処理>
rescue => <変数>
<例外が起こった場合の処理>
ensure
<例外の有無に関わらず実行される処理>
end
begin
x = 10
y = "a"
p x + y
rescue => ex
puts(ex.message)
ensure
puts("足し算をしました")
end
##やりなおし
rescueでretryを使うと例外処理の実行をやり直す。
flag = 0
begin
open("/no/file") do |f|
end
rescue => ex
flag += 1
puts ex.message
if flag < 3
retry
end
end
##メソッドでの例外処理の書き方
def foo(x, y)
add = x + y
sub = x - y
begin
mul = x * y
div = x / y
rescue => ex
puts(ex.message)
ensure
return add, sub, mul, div
end
end
foo(10, 0) # エラーが発生する
beginとendを省略できる。
def foo
<メソッドの本体>
rescue => ex
<例外処理>
ensure
<後処理>
end
rescueがない場合はメソッドを呼び出したところに戻りながら例外処理を探す。
def add(a, b)
a + b
end
def call_add
add("a", 1)
end
begin
call_add()
rescue => ex
puts(ex.message)
end
#クラスでの例外処理
class Foo
<クラスの本体>
rescue => ex
<例外処理>
ensure
<後処理>
end
もしクラスの処理をすべて例外処理で囲む時は、beginとendを省略して書くことができます。ただし、クラスを定義している中で例外が起こると、そこから後のメソッドの定義などがおこなわれません。そのため、通常のプログラムでクラスの定義をすべて例外処理で囲むことはしません。クラスの定義では例外が発生しないことが望まれます。
#特定の例外の処理
例外のクラス名を書くことによって、その例外の時だけおこないたい処理を書くことができます
begin
<例外を発生させる可能性のある処理>
rescue <例外1の名前>, <例外2の名前> => <変数1>
<指定した例外1または例外2でおこないたい処理>
rescue <例外3の名前> => <変数2>
<指定した例外3でおこないたい処理>
rescue
<それ以外の例外が起こった場合の処理>
end
begin
require "file_not_exist"
rescue LoadError
puts("file_not_exist.rbというファイルは見つかりませんでした")
end
#例外を発生させる
raise:条件を判定した結果によって例外を発生させるメソッド、raiseメソッドは、引数を指定しないで呼び出すとRuntimeError例外を発生します。
raise <発生させたい例外クラス>
]
#エラーのクラス
例外のクラス