概要
- 例外処理についての基本的なことについてまとめです
実務において例外処理を行わないことはないので、基礎的な部分を記載しておきます。
基礎構文
begin
# エラーが起こりうる処理
rescue
# エラーが起きた時にどのような挙動をしてほしいか記述
end
エラーを捕捉したい場合は上記のように begin ~ rescue
の間に処理を挟む。
エラーが起きると rescue ~ end
の間に処理が移る。
ちなみにメソッド単位なら begin
は省略可能
rescue は複数書ける
begin
# エラーが起こりうる処理
rescue NomethodError
puts 'NomethodError'
rescue RuntimeError
puts 'RuntimeError'
rescue StandardError
puts 'StandardError'
end
特定のエラー起こしたい → raise
begin
raise RuntimeError
rescue NomethodError
puts 'NomethodError'
rescue RuntimeError
puts 'RuntimeError' # => ここに処理が飛ぶ
rescue StandardError
puts 'StandardError'
end
- raise で特定のエラーを引き起こすことができる
- ここでは
raise RuntimeError
とすることでrescue RuntimeError
に処理が飛ぶ
特定のエラーを作りたいぜ! → エラーを継承
class FugaError < StandardError; end
begin
raise FugaError
rescue FugaError
puts "FugaError"
end
# 出力
# FugaError
-
StandardError
を継承して特定のエラーを作り出すことができる
rescue
の処理の順番に注意すること
class FugaError < StandardError; end
class HogeError < FugaError; end
begin
raise HogeError
rescue FugaError
puts "FugaError"
rescue HogeError
puts "HogeError"
end
# 出力
# FugaError
- エラーが参照されるのは親から。
-
StandardError > FugaError > HogeError
の順で継承している。 -
FugaError
がHogeError
より上に記載されており、かつHogeError
はFugaError
の子クラスなので先に参照されてしまう。 -
HogeError
出したければ逆にすること
class FugaError < StandardError; end
class HogeError < FugaError; end
begin
raise HogeError
rescue HogeError
puts "HogeError"
rescue FugaError
puts "FugaError"
end
# 出力
# HogeError
ちなみに raise
のみ記載しておくと StandardError
として捕捉される
begin
raise
rescue => e
p e.class
#=> StandardClass
end
番外編:例外処理の定義の仕方色々
#パターン1 通常
# begin
# raise StopIteration
# rescue KeyError => e
# p 'きーえらー'
# rescue StopIteration => e
# p 'すとっぷいてれーしょん'
# end
# パターン2 横につなげる
# begin
# raise NoMethodError
# rescue KeyError, StopIteration, NoMethodError
# p 'きーえらーとストップイテレーションとのーめそっどえらー'
# rescue StopIteration => e
# p 'すとっぷいてれーしょん'
# end
# パターン3 スプラッシュ演算子
begin
raise NoMethodError
rescue *[KeyError, StopIteration, NoMethodError]
p 'きーえらーとストップイテレーションとのーめそっどえらー'
rescue StopIteration => e
p 'すとっぷいてれーしょん'
end