はじめに

プログラムがエラーで落ちてしまったことはありませんか?
おそらく、ほとんどの方が経験あるでしょう。
プログラムでは、よくエラーに遭遇します。思い違いやちょっとしたミスによるエラーは事前に回避することは難しいですが、初めからエラーが発生することがわかっている場合もあります。
たとえば、ネットワークを扱う場合などです。外部とやり取りするプログラムは、状況によってはエラーを起こします。
これは、あきらかになんらかの対策が必要な部分です。
この記事では、Ruby初心者の方向けに、例外とエラー処理についてお伝えしていきます。

エラーと例外

多くの方は、使っているソフトやアプリがエラーで終了してしまったという経験をお持ちでしょう。
プログラムにエラーはつきものです。Rubyでは、エラーが発生すると「例外(Exception)」が投げられます。
これは、エラーが発生したことを知らせるものです。
まずは、Rubyでエラーが発生するとどうなるかみてみましょう。

例外を発生させてみよう

ここでは、次のように除算によるエラーを発生させてみます。
例:

1 / 0

数学的に数値を0で割ることはできません。
このため、0除算はエラーとなり、Rubyでは例外として” ZeroDivisionError”が発生します。
わざわざ例外を発生させるのには理由があります。
それは、エラー処理を可能にするためです。
次に、エラー処理の方法についてみていきましょう。

予想される例外に対してエラー処理を書こう

事前に例外(エラー)が発生することがわかっている場合には、例外処理を書くことで解決できます。
次のように、想定される例外に対してエラー処理を行います。
例:

input1 = 10 #ユーザーからの入力など
input2 = 0
begin
    puts input1 / input2
rescue ZeroDivisionError
    puts "0で割ることはできません"
end
puts "プログラム終了"

例のように、例外が発生することがわかっている場合は、該当する例外に対してエラー処理を書きます。
すると、その例外が発生したときにエラー処理が実行され、プログラムはなにごともなかったかのように最後まで実行されます。
“rescue節”は複数書くことができ、さまざまな例外に対処可能です。
また、例外型を省略すると、すべての例外に対してエラー処理が実行されます。

例外は自分で発生させることもできる

例外は、組み込みの演算子やメソッドから発生するだけでなく、自分でも独自に例外を発生させることができます。
次の例をみて下さい。
例:

class Animal
    def initialize(name)
        raise ArgumentError, "名前がありません" if name.empty?
        @name = name
    end
    def say
        puts "My name is #{@name}"
    end
end
a = Animal.new("")

この例では、自作のクラスの”initializeメソッド”で引数のチェックを行っています。
空の文字列が渡された場合、”ArgumentError”を発生させて無効な引数であることを伝えます。
”raise句”には、当然のことながら例外型しか渡せませんので注意しましょう。

例外クラスを自分で作ってみよう

これまで、”ZeroDivisionError”や”ArgumentError”を扱ってきました。
このような例外型は、自分でも作ることができます。
それには、次のように” StandardErrorクラス”のサブクラスとして定義します。
例:

class NoNameError < StandardError
end
class Animal
    def initialize(name)
        raise NoNameError if name.empty?
        @name = name
    end
    def say
        puts "My name is #{@name}"
    end
end
begin
    a = Animal.new("")
rescue NoNameError
    puts "名前がありません"
end

例のように、独自の例外型を定義するのは簡単です。
” StandardErrorクラス”を継承することを忘れないようにしましょう。
そうすれば、組み込みの例外型と同じように扱うことができ、”rescue節”でも問題なく捕捉できます。
Rubyには、たくさんの汎用的な例外型が定義されているため、組み込み型で適切な例外型が見つからなかった場合に、自作の例外型を作るとよいでしょう。
自作の例外型はアプリケーションに特化した名前にできるため、プログラムがわかりやすくなります。

まとめ

例外とエラー処理について理解できましたか?
プログラムでは、どうしてもエラーが避けられない場合があります。
特に、外部に依存している箇所はエラーを起こしやすい場所です。
事前にエラーを起こしそうなことがわかっている場合は、例外を捕捉してエラー処理をしましょう。
エラー落ちしない堅牢なプログラムを作れるようになって下さい。