Ruby=>エラー処理と例外

2220 ワード

1.例外処理の書き方:

begin
              
rescue 
            
end

Rubyは例外も対象とした.rescueの後に変数名を指定し、例外オブジェクトを取得します.

begin
              
rescue =>            
            
end

変数名が指定されていなくても、例外オブジェクトは表9.1にリストされている変数に自動的に格納されますが、変数名を明確に指定するプログラムがわかりやすいです.
例外発生時に自動的に設定される変数
変数#ヘンスウ#
意味
$!
最後に発生した例外(オブジェクトなど)
$@
最後の例外が発生した場所に関する情報
また,例外オブジェクトに対して次のようなメソッドを呼び出し,例外に関する情報を取得する.
メソッド名
意味
class
例外カテゴリ
message
例外メッセージ
backtrace
例外の発生位置情報($@は!.backtraceに等しい)
2.善後処理

begin
              
rescue =>            
            
ensure
                    
end

begin
              
ensure
                    
end

3.再実行
rescue文ブロックではretry文を使用してbegin文ブロックの動作を再実行できます.
例:
次の例では、オープンメソッドを10秒おきに再試行し、成功するとファイルの内容を返します.

file = ARGV[0]
begin
  io = open(file)
rescue
  sleep 10
  retry
end
data = io.read
io.close

しかし、ファイルが開かないままでは、無限のループになることに注意してください.
4.rescue式

# -*- coding: utf-8 -*-
=begin
rescue       ,       ,   rescue  。
=end

# val = "abc"                # n => 0
val = 3                      # n => 3
n = Integer(val) rescue 0
p n

5.例外処理補充
例外処理のbegin~end範囲がメソッド全体である場合、beginとendを省略し、rescueとensure文ブロックのみを書くことができる.
6.例外クラス
すべての例外はExceptionクラスのサブクラスです.
resure文ブロックに例外クラスが指定されていない場合、StandardErrorとそのサブクラスがスナップされます.
したがって,自分が種々の例外クラスを定義する場合,StandardErrorクラスを継承し,次に種々の例外クラスを継承するのが一般的である.
7.例外の発生
自分が例外を発生させたい場合はraiseメソッドを使用します.
8.catchとthrow

def test_throw
  throw :test
end

puts "test start"
catch(:test){
  puts "before test_throw()"
  test_throw
  puts "after test_throw()"
}
puts "test end"