例外とは?
CoddyのRubyジャーニー「ロジックとフロー」セクションの一部 — レッスン 43/56。
実行時に、ゼロによる除算、"abc" を整数として解析すること、nil に対してメソッドを呼び出すことなど、何かがうまくいかなくなったとき、Rubyは例外を発生させます。プログラムは停止し、Rubyは何がどこで起こったかを出力します。
10 / 0
# ZeroDivisionError: divided by 0失敗の各種類は、それぞれ独自のクラスになっています。一般的なものをいくつか挙げます:
ZeroDivisionError:整数をゼロで除算した場合ArgumentError:メソッドに誤った引数が渡された場合(Integer("abc"))
NoMethodError: レシーバが持っていないメソッドの呼び出し (nil.upcase)TypeError: 誤った種類のオブジェクトに対する操作 ("a" + 1)
すべての例外クラスには .message があります。これは、例外が処理されないときに Ruby が出力する、人間が読める形式の説明です。次のレッスンでは、プログラムの実行を継続できるように、これらの例外をキャッチする方法を説明します。
チャレンジ
初心者1行の入力を読み込みます。これはRubyの式名です。それに対してRubyが発生させるであろう例外クラスの名前を出力してください。case文を使用してください(実際に例外を発生させる必要はありません):
divide-by-zero→ZeroDivisionErrornil-method→NoMethodErrorbad-integer→ArgumentErrorwrong-type→TypeError- その他 →
Unknown
入力がnil-methodの場合、出力はNoMethodErrorとなります。
チートシート
実行時に何らかの問題が発生すると、Rubyは例外を発生させ、プログラムが停止します。一般的な例外クラスは以下の通りです:
ZeroDivisionError: 整数をゼロで割った場合ArgumentError: 引数が正しくない場合(例:Integer("abc"))NoMethodError: レシーバが持っていないメソッドを呼び出した場合(例:nil.upcase)TypeError: 期待されない型のオブジェクトに対して操作を行った場合(例:"a" + 1)
10 / 0
# ZeroDivisionError: 0で除算されましたすべての例外オブジェクトは .message を持っており、人間が読める形式の説明が含まれています。
自分で試してみよう
kind = gets.chomp
# TODO: case kind ... 一致する例外クラス名を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。