0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

学び直し Rubyがミニツク Part11

Posted at

今日の教科書
エラーメッセージ

#エラーメッセージ

ファイル名:行番号: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 <発生させたい例外クラス>]

#エラーのクラス
例外のクラス

0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?