【Ruby入門】例外処理とは?使い方を解説!【#11】


こんにちは。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

 

実行結果
ZeroDivisionError
“divided by 0”
[“Main.rb:6:in `/'”, “Main.rb:6:in `<main>'”]
“0除算をしています”

 

上記の例では、例外オブジェクトに型(種類)を指定していないため、全ての以外を取得できます。

ただし、特定のエラーを取得して処理を記述したい場合は、型を指定することもできます。

 

では以下のプログラムを実行してみて下さい。

# 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

 

実行結果
“ZeroDivisionErrorが発生しました。”
“TypeErrorが発生しました。”

 

また、例外オブジェクトを記載しない場合でも、以下のオブジェクトに内容が自動的にセットされます。

  •  $! : 最後に発生した例外オブジェクト
  •  $@ : 最後に発生した例外の位置情報

 

では、以下のプログラムを実行してみて下さい。

x = 0

begin
  # 0除算をした場合
  p 10 / x
rescue
  p $!
  p $!.class
  p $!.message
  p $!.backtrace
  p $@
  p "0除算をしています"  # メッセージを出力したい場合
end

 

実行結果
#<ZeroDivisionError: divided by 0>
ZeroDivisionError
“divided by 0”
[“Main.rb:6:in `/'”, “Main.rb:6:in `<main>'”]
[“Main.rb:6:in `/'”, “Main.rb:6:in `<main>'”]
“0除算をしています”

 

実行結果の通り、エラー内容について確認できました。

ただし、例外オブジェクトを定義した場合の方がわかりやすいので、通常は定義するようにしましょう。

 

例外の発生に関わらず処理を実行する『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

 

実行結果
“divided by 0”
ensureの処理を実行しました。
5
ensureの処理を実行しました。

 

例外が発生しなかった場合に処理を実行する『else』

『else』を定義し、例外が発生しなかった場合の処理を記述することができます。

では以下のプログラムを実行してみて下さい。

# 2で割り切れる場合
x = 2
begin
  p 10 / x
rescue => ex
else
  puts "elseの処理を実行しました。"
end

 

実行結果
5
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

 

実行結果
MyErrorが発生しました。

 

まとめ

  •  例外が発生しそうな箇所をbegin〜endで囲み、rescueで例外オブジェクトと例外発生時の処理を定義する
  •  例外が発生した場合、$!や$@オブジェクトにも自動的に例外がセットされる
  •  例外の発生に関わらず実行したい処理がある場合は『ensure』、例外が発生していない場合に実行したい処理がある場合は『else』を定義する

 

今回は例外処理について解説しました。

Rubyでの開発の場合は、Ruby on Railsなどのフレームワークを使って開発をするため、例外処理を記述することはあまりないようです。

ただ場合によっては記述が必要になることもあるので、まずは基礎を押さえておきましょう!

 

  •  関連記事

【無料あり】Ruby入門サイトおすすめ3選!初心者向けの学習方法を解説

2017年10月24日

 

The following two tabs change content below.

Tomoyuki

SEを5年経験後、全くの未経験ながら思い切ってブロガーに転身し、月間13万PVを達成。その後コロナの影響も受け、以前から興味があったWeb系エンジニアへのキャリアチェンジを決意。現在はWeb系エンジニアとして働きながら、プロゲーマーとしても活躍できるように活動中。








シェアはこちらから


【2024年】おすすめのゲーミングPC

モンハンワイルズの発売日とPC版(Steam版)の推薦スペックが公開されたので、おすすめのゲーミングPCをご紹介!


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です