LoginSignup
0
1

More than 1 year has passed since last update.

例外処理について基本

Last updated at Posted at 2021-08-28

概要

  • 例外処理についての基本的なことについてまとめです

実務において例外処理を行わないことはないので、基礎的な部分を記載しておきます。

基礎構文

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 の順で継承している。
  • FugaErrorHogeError より上に記載されており、かつ HogeErrorFugaError の子クラスなので先に参照されてしまう。
  • 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

0
1
1

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
1