こんにちは。Tomoyuki(@tomoyuki65)です。
みなさん、例外処理って聞いたことありますか?
エンジニアとして業務に携わったことがある方でないと、それ何って感じかと思います。
例外処理は、エラー原因やエラー箇所の特定を容易に行うことや、発生したエラーに対して適切な処理をさせるために記述するんです!
趣味でプログラミングをする分には必要ないかもしれませんが、製品開発の際にはユーザビリティの向上にも繋がります。
この記事では、そんな例外処理について解説します。
例外処理の書き方
まずは例外処理の書き方を見てみましょう。
begin 例外が発生しそうな処理 rescue => 例外オブジェクト 例外が発生した場合の処理 end
「rescue => 例外オブジェクト」というのは、発生した例外内容を例外オブジェクトで取得します。
例外を取得した場合、以下のメソッドが使用可能です。
- class : 例外の種類
- message : 例外のメッセージ
- backtrace : 例外発生の位置情報
では例として以下のプログラムを実行してみて下さい。
x = 0
begin
# 0除算をした場合
p 10 / x
rescue => ex
p ex.class
p ex.message
p ex.backtrace
p "0除算をしています" # メッセージを出力したい場合
end
“divided by 0”
[“Main.rb:6:in `/'”, “Main.rb:6:in `<main>'”]
上記の例では、例外オブジェクトに型(種類)を指定していないため、全ての以外を取得できます。
ただし、特定のエラーを取得して処理を記述したい場合は、型を指定することもできます。
では以下のプログラムを実行してみて下さい。
# 0除算をした場合
x = 0
begin
p 10 / x
rescue ZeroDivisionError => ex # 例外の型を指定
p "ZeroDivisionErrorが発生しました。"
rescue TypeError => ex # 例外の型を指定
p "TypeErrorが発生しました。"
end
# 文字列で割ろうとした場合
x = "err"
begin
p 10 / x
rescue ZeroDivisionError => ex # 例外の型を指定
p "ZeroDivisionErrorが発生しました。"
rescue TypeError => ex # 例外の型を指定
p "TypeErrorが発生しました。"
end
“TypeErrorが発生しました。”
また、例外オブジェクトを記載しない場合でも、以下のオブジェクトに内容が自動的にセットされます。
- $! : 最後に発生した例外オブジェクト
- $@ : 最後に発生した例外の位置情報
では、以下のプログラムを実行してみて下さい。
x = 0
begin
# 0除算をした場合
p 10 / x
rescue
p $!
p $!.class
p $!.message
p $!.backtrace
p $@
p "0除算をしています" # メッセージを出力したい場合
end
ZeroDivisionError
“divided by 0”
[“Main.rb:6:in `/'”, “Main.rb:6:in `<main>'”]
実行結果の通り、エラー内容について確認できました。
ただし、例外オブジェクトを定義した場合の方がわかりやすいので、通常は定義するようにしましょう。
例外の発生に関わらず処理を実行する『ensure』
『ensure』を定義し、例外の発生に関わらず処理を実行することができます。
では以下のプログラムを実行してみて下さい。
# 0余算の場合
x = 0
begin
p 10 / x
rescue => ex
p ex.message
ensure
puts "ensureの処理を実行しました。"
end
# 2で割り切れる場合
x = 2
begin
p 10 / x
rescue => ex
ensure
puts "ensureの処理を実行しました。"
end
ensureの処理を実行しました。
5
ensureの処理を実行しました。
例外が発生しなかった場合に処理を実行する『else』
『else』を定義し、例外が発生しなかった場合の処理を記述することができます。
では以下のプログラムを実行してみて下さい。
# 2で割り切れる場合
x = 2
begin
p 10 / x
rescue => ex
else
puts "elseの処理を実行しました。"
end
elseの処理を実行しました。
自分で作成した例外を定義する場合
Rubyで用意されている例外ではなく、自分で例外を定義してその例外を取得することも可能です。
その場合、例外の発生には「raise 例外クラス」を使用します。
では以下のプログラムを実行してみて下さい。
# Rubyの標準的な例外クラスである「StandardError」を継承してクラスを定義
class MyError < StandardError; end
x = 3
begin
# xが3と等しい場合、例外「MyError」を発生させる
if x == 3
raise MyError
end
10 / x
rescue MyError
puts "MyErrorが発生しました。"
rescue => ex
p ex.message
end
まとめ
- 例外が発生しそうな箇所をbegin〜endで囲み、rescueで例外オブジェクトと例外発生時の処理を定義する
- 例外が発生した場合、$!や$@オブジェクトにも自動的に例外がセットされる
- 例外の発生に関わらず実行したい処理がある場合は『ensure』、例外が発生していない場合に実行したい処理がある場合は『else』を定義する
今回は例外処理について解説しました。
Rubyでの開発の場合は、Ruby on Railsなどのフレームワークを使って開発をするため、例外処理を記述することはあまりないようです。
ただ場合によっては記述が必要になることもあるので、まずは基礎を押さえておきましょう!
- 関連記事
Tomoyuki
最新記事 by Tomoyuki (全て見る)
- 【スト6】モダンキャミィの初心者向けコンボまとめ【STREET FIGHTER 6(ストリートファイター6)】 - 2024年11月10日
- モンハンワイルズでおすすめのオプション設定まとめ【Monster Hunter Wilds】 - 2024年11月4日
- モンハンワイルズでおすすめのグラフィック設定まとめ【Monster Hunter Wilds】 - 2024年11月2日
コメントを残す