Ruby初心者必見!エラー処理の基本「raise」を完全理解する5ステップ

Rubyのraiseを学ぶ初心者が画面を見つめるイメージRuby
この記事は約11分で読めます。

 

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Rubyプログラミングの道を歩み始めた皆さん、こんにちは。

コードを書いていると必ずと言っていいほど遭遇するのがエラーです。

エラーとは、何かがうまくいかなかったときにプログラムが発生させるシグナルのことを指します。

エラーは怖いものではありません。

むしろ、それはプログラムが期待どおりに動作していないことを示す重要な手がかりです。

この記事を読むと、Rubyのエラー処理の基本である「raise」の使い方を理解し、プログラミングのスキルを更に磨き上げることができます。

●Rubyとは?

Rubyは、日本人のまつもとゆきひろ(通称Matz)さんによって開発されたプログラミング言語です。

○プログラミング言語Rubyの特徴

Rubyは人間中心の設計思想を持っており、プログラムの可読性が高く、比較的短いコードで強力な機能を実現できます。

さらに、Rubyはオブジェクト指向プログラミング言語であり、全てがオブジェクトとして扱われるため、抽象的な思考が可能となります。

●エラー処理とは?

プログラミングにおけるエラー処理とは、プログラムが正常に動作しない状況、すなわちエラーが発生した場合の対応方法を定義することを指します。

○エラー処理の目的と重要性

エラー処理の目的は、プログラムが予期せぬエラーに遭遇したときでも、適切に対応してプログラムの実行を継続することです。

これにより、プログラムは安全に、そして予測可能な方法で動作します。

このようなエラー処理は、プログラムが複雑になるほど重要性を増していきます。

●Rubyでのエラー処理の基本: raise

Rubyにおけるエラー処理の基本は「raise」です。

raiseはエラー、すなわち例外を発生させるためのメソッドです。

○raiseの基本的な使い方

raiseは例外を発生させるために使用します。

基本的な使い方は次の通りです。

raise "エラーメッセージ"

上記のコードは、標準エラー(StandardError)という種類のエラーを発生させ、”エラーメッセージ”というメッセージを出力します。

この例では、”エラーメッセージ”を変更することで、エラーの内容を自由に指定することができます。

○raiseで例外を送出する方法

raiseを用いて、具体的な例外を送出することも可能です。

具体的な例外を指定することで、より詳細なエラー情報を伝えることができます。

例えば、次のように書くことができます。

raise ArgumentError, "不適切な引数です"

このコードは、ArgumentErrorという特定の例外を送出し、”不適切な引数です”というメッセージを出力します。

この例では、ArgumentErrorを使って不適切な引数を与えたことを示しています。

○サンプルコード1:raiseを使ってみよう

それでは、具体的なコードを見ていきましょう。

このコードでは、raiseを使って例外を発生させ、そのメッセージを出力しています。

def check_age(age)
  # ageが整数でなければエラーを発生させる
  raise "年齢は整数で入力してください" unless age.is_a?(Integer)

  # ageが0より小さければエラーを発生させる
  raise "年齢は0以上の値で入力してください" if age < 0

  # ageが130より大きければエラーを発生させる
  raise "年齢が大きすぎます" if age > 130

  "あなたの年齢は#{age}歳です"
end

puts check_age(20)   # => "あなたの年齢は20歳です"
puts check_age(-1)   # => RuntimeError: 年齢は0以上の値で入力してください
puts check_age(150)  # => RuntimeError: 年齢が大きすぎます
puts check_age("20") # => RuntimeError: 年齢は整数で入力してください

この例では、関数check_age内で年齢の値をチェックし、値が不適切な場合にはraiseを使って例外を発生させています。

不適切な値とは、年齢が整数でない、0より小さい、または130より大きい場合を指します。

上記のコードを実行すると、20歳という適切な年齢を入力した場合には正常なメッセージが出力されます。

しかし、-1歳、150歳、”20歳”(文字列)といった不適切な年齢を入力した場合には、各々適切なエラーメッセージが出力され、例外が発生します。

これらの例外はすべてRuntimeErrorという種類のエラーで、そのメッセージがraiseの引数として与えられた文字列となります。

●raiseを活用したエラー処理の詳細

上述したraiseの使い方に加えて、より詳細なエラー処理を行う方法について解説します。

○エラーメッセージをカスタマイズする方法

raiseを用いると、エラーメッセージは自由にカスタマイズすることができます。

具体的なエラーの原因を表すメッセージを設定することで、デバッグを容易にします。

raise "ファイルが見つかりません" unless File.exist?("myfile.txt")

上記のコードでは、”myfile.txt”という名前のファイルが存在しない場合に、”ファイルが見つかりません”というメッセージとともに例外が発生します。

この例では、ファイルが存在しないことを原因としたエラーを明示的に示しています。

○サンプルコード2:カスタムエラーメッセージの作り方

Rubyでは、標準の例外クラス以外にも自作の例外クラスを作成することができます。

これにより、より具体的なエラーメッセージを設定することができます。

# 独自のエラークラスを定義
class MyError < StandardError; end

# エラーを発生させる
raise MyError.new("これはカスタムエラーです")

このコードでは、まずMyErrorという独自のエラークラスを定義しています。

そして、そのクラスを使用してエラーを発生させています。

その際には、MyError.new("これはカスタムエラーです")の形でエラーメッセージを指定します。

エラーメッセージは、開発者がデバッグを行う際に重要な情報を提供します。

そのため、エラーの原因や状況を具体的に表すメッセージを設定することは、効率的なデバッグに繋がります。

○特定の条件下でエラーを発生させる方法

エラーは、プログラムが期待する動作をしなかった場合や、予期しない入力があった場合など、様々な状況で発生します。

そのような状況を具体的に指定してエラーを発生させることができます。

例えば、関数の引数が特定の範囲に含まれていない場合にエラーを発生させることができます。

def divide(a, b)
  raise ArgumentError.new("0で除算はできません") if b == 0
  a / b
end

puts divide(10, 2) # => 5
puts divide(10, 0) # => ArgumentError: 0で除算はできません

この例では、divide関数は2つの引数abを受け取り、abで除算します。

ただし、bが0の場合にはエラーを発生させています。

このように、エラーを発生させる条件を自由に定義することができます。

○サンプルコード3:条件指定によるエラー発生

さらに具体的な条件を設定してエラーを発生させる方法を見てみましょう。

class InvalidAgeError < StandardError; end

def check_age(age)
  raise InvalidAgeError.new("年齢は0以上の値で入力してください") if age <

 0
  "あなたの年齢は#{age}歳です"
end

puts check_age(20) # => "あなたの年齢は20歳です"
puts check_age(-1) # => InvalidAgeError: 年齢は0以上の値で入力してください

このコードでは、まずInvalidAgeErrorという独自のエラークラスを定義します。

次にcheck_age関数では、引数ageが0未満の場合にこのエラーを発生させます。

●応用:raiseを使ったエラーハンドリング

エラーが発生した際、ただプログラムを止めるだけでなく、エラーに対して何らかの対応を行うことが重要です。

これがエラーハンドリングと呼ばれるものです。

Rubyでは、raiseと組み合わせてrescueを使用することでエラーハンドリングを行うことができます。

下記の例では、エラーが発生した際にそのエラーメッセージを出力し、プログラムを続行するためのコードを記述しています。

def divide(a, b)
  begin
    raise ArgumentError.new("0で除算はできません") if b == 0
    a / b
  rescue ArgumentError => e
    puts e.message
  end
end

puts divide(10, 2) # => 5
puts divide(10, 0) # => "0で除算はできません"

このコードでは、まずbeginendで囲んだ範囲でエラーハンドリングを行います。

beginendの間のコードが実行され、その中でエラーが発生した場合、rescue以下のコードが実行されます。

また、rescue ArgumentError => eの部分では、発生したエラーの情報をeという変数に格納します。

これにより、エラーの詳細な情報を取得したり、エラーによる影響を最小限に抑えたりすることが可能になります。

○サンプルコード4:ユーザー定義エラークラスの作成

特定の目的や状況に適したエラークラスを自分で定義することも可能です。

下記の例では、入力された年齢が適切な範囲に含まれていない場合に発生するエラークラスを定義しています。

class InvalidAgeError < StandardError; end

def check_age(age)
  raise InvalidAgeError.new("年齢は0以上の値で入力してください") if age < 0
  "あなたの年齢は#{age}歳です"
end

puts check_age(20) # => "あなたの年齢は20歳です"
puts check_age(-1) # => InvalidAgeError: 年齢は0以上の値で入力してください

このコードでは、InvalidAgeErrorという新たなエラークラスを定義しています。

そして、そのエラークラスを使って年齢が0未満の場合にエラーを発生させています。

こうすることで、エラーの原因や発生条件をプログラマー自身が細かく制御することが可能になります。

○サンプルコード5:raiseとrescueを組み合わせたエラーハンドリング

前のステップでは、raiseを使用して特定の状況でエラーを発生させる方法と、独自のエラークラスを作成する方法を学びました。

今度は、raiseとrescueを組み合わせてエラーハンドリングを行う方法について詳しく見ていきましょう。

下記のコードでは、独自のエラークラスInvalidAgeErrorを使って、年齢が適切な範囲に含まれていない場合にエラーを発生させ、そのエラーをrescueで捕捉して処理する方法を紹介しています。

class InvalidAgeError < StandardError; end

def check_age(age)
  raise InvalidAgeError.new("年齢は0以上の値で入力してください") if age < 0
  "あなたの年齢は#{age}歳です"
rescue InvalidAgeError => e
  puts e.message
end

puts check_age(20) # => "あなたの年齢は20歳です"
puts check_age(-1) # => "年齢は0以上の値で入力してください"

このコードを実行すると、まず20歳の場合は問題なく年齢が表示されます。

しかし、-1歳という不適切な値が入力されると、raiseによりInvalidAgeErrorが発生し、そのエラーがrescue節で捕捉され、エラーメッセージが出力されます。

このように、raiseとrescueを組み合わせることで、エラー発生時の挙動を自在に制御することが可能になります。

●エラー処理の注意点と対策

エラーハンドリングは重要な技術ですが、適切に行わないと予期せぬ問題を引き起こす可能性もあります。

例えば、すべてのエラーを捕捉してしまうと、エラーの原因を特定するための重要な情報が失われることがあります。

このため、rescue節で捕捉するエラーの種類を適切に指定することが求められます。

また、エラーハンドリングは問題の解決ではなく、問題が発生した際の対応です。

エラーが発生しないように、コードを改善し、テストを行うことが基本的な対策となります。

まとめ

本記事では、Rubyのエラー処理について学びました。

特に、raiseとrescueの使い方と、それらを組み合わせたエラーハンドリングの方法について詳しく解説しました。

エラー処理はプログラミングにおいて避けては通れない重要なテーマです。

しかし、それだけに理解が難しく感じるかもしれません。本記事がRubyでのエラー処理の理解に少しでも寄与できれば幸いです。

最後に、エラーハンドリングはあくまで問題が発生した際の対策であり、問題そのものの解決ではありません。

常にコードの改善とテストに努めることで、エラーを未然に防ぐことが最良の対策となるでしょう。

あなたのプログラミングライフが、エラーと上手に向き合いながら、より良いものとなることを願っています。