はじめに
例外処理について学ぶタイミングってなかなかないですよね〜。
とはいえ、実務になると普通によく遭遇します。
ということで、これからエンジニアになりたい人、エンジニアになりたての人に向けて、例外とは何かというところから丁寧に解説した記事です。
ぜひご覧ください。
#そもそも例外とは
プログラミングにおいていわゆるエラーと呼ばれるものには2種類あります。
1つは、シンプルにエラー。もう一つはバグ。
この二つの違いは以下です。
□エラー → 開発者が想定していなかったエラー
□バグ → 開発者が認識しているエラー
※エラーには構文(Syntax)エラーと論理エラーがありますが、ここでは詳細を割愛します。
前提として、開発者はバグを治す必要があります。
そこで、「ここでエラーが起こるかもしれないなぁ」と思う箇所に、エラーが発生した場合の対処法をコードに落とし込んでおいたり、エラーメッセージをログに残すことで、開発者がエラーの改修をすばやく行うことができるようになります。
それこそが、例外処理であり、そのエラーが発生した時の情報をログで残しつつ、救済処置を用意しておくことで、エラーが発生した時は例外処理で対処しつつ、今後そのエラーを減らしたり、対策したりするためにログで情報を残すことができます。
ここからはRubyの例外処理です。
#Rubyの例外とは
まず、Rubyの例外とはどのようなものなのか。
Rubyでは例外もオブジェクトである。
オブジェクトなので例外オブジェクトはメソッドを持っています。このメソッドを使うことで発生した例外の情報を抜き出すことができます。
具体的な情報の抜き出し方は後ほど説明します。
まずは、例外発生の具体例を見てみましょう。
def method_1
puts 'メソッド処理スタート!'
1 / 0 #ゼロ除算で例外を発生させる
end
メソッド処理スタート!
ZeroDivisionError: divided by 0 # エラー発生!プログラムも止まる。
このZeroDivisionErrorが例外であり、例外オブジェクトと呼ばれるものです。
また、1 / 0 より前にあるputs はきちんと出力されていますね!
また、例外はオブジェクトなので、以下のようなメソッドを持っています。
# error は例外が発生した時にできる例外オブジェクトというものです。
error.class # エラーオブジェクトのクラス
error.message # エラーオブジェクトのクラス
error.backtrace # バックトレース
これらのメソッドで例外が発生した際の情報が得られます。情報は、エラーオブジェクトのクラスや、エラーオブジェクトのクラス、バックトレース(エラーが発生するまでにたどったコードたち)。
しかし、一つ目の例で見たコードだと普通にエラーを吐いてコードが止まりますね。(1 / 0の部分)
このままではerrorオブジェクトはキャッチできないですし、まず本番コードだと普通にバグでアプリケーションが死んでしまいます笑
例外処理
ってことで、ここからは例外処理というものを学びます!
例外処理は以下の記法で書けます。
begin
# 例外が起こりうる処理
rescue => error
# 例外が発生した場合の処理
end
これでbeginで発生したエラーのオブジェクトがerrorとしてキャッチでき、プログラムも止まりません。
さっきのゼロ除算を例に見ると以下になります。
def method_1
puts 'メソッド処理スタート!'
begin
1 / 0 #ゼロ除算で例外を発生させる
rescue => e # エラーキャッチ! 例外オブジェクトは、errorじゃなくてもどんな文字列でもおけです。eという記法が良く使われます。
e.class
e.message
e.backtrace
end
end
メソッド処理スタート!
ZeroDivisionError # エラーオブジェクトのクラス
divided by 0 # エラーメッセージ
(irb):2:in '/' # バックトレース
(irb):2:in 'irb_binding' # バックトレース
(略)
これでプログラムを止めずにエラーの原因を特定する情報も手に入れることができますね!
#まとめ
ここまで例外と例外処理について説明してきました。
しかし、例外処理は積極的に使うべきではありません。
フレームワークのRailsであればエラーが発生した時に、ユーザーをエラー画面に遷移させる例外処理が組み込まれています。
変にいじってしまうと元々の「レール」から外れてしまいかねません。RailsのベストプラクティスはRails側が用意したレールの上を走り続ける事です。
特に初心者の方は、「例外が発生したら即座に異常終了させよう」「フレームワークの共通処理に全部丸投げしよう」と考えましょう!
#参考文献
書籍: プロを目指す人のためのRuby入門(伊藤 淳一)