例外処理について
本記事では例外処理についてまとめていきます。
※例外…プログラムの実行中に発生する異常やエラーのこと。
p
…例外オブジェクトの確認を行う
beginとrescueとensure
…beginブロック内で発生した例外をとらえ、適切に処理をするために
rescueブロックを用いる。ensureブロック内に記載された処理は
例外が発生してもしなくても実行される。
beginブロックで行った処理の後処理が必要な場合に用いられる。
example_1.rb
begin
# 例外が発生する可能性のある処理
result = 10 / 0 # ゼロ除算が発生してエラーになるコード
# rescue単体でも使用できるが、下記のように特定のエラーが発生した場合にも使用できる
rescue ZeroDivisionError => e
# 例外発生時の処理
puts "エラーが発生しました: #{e.message}"
# 必ず実行される処理
ensure
puts "処理が完了しました"
end
retry
…例外処理内部に入ったときに使用する。
example_2.rb
a = 0
begin
b = 1 / a
rescue ZeroDivisionError
a += 1
# もしZeroDivisionErrorが発生した場合、beginの先頭処理に戻って再び処理を行う
retry
ensure
p b
=> 1
end
raise
…明示的に例外を発生させたい場合に使用する。
example_3.rb
# rails <エラー名>でも使用できるが、引数にエラーメッセージを設定することができる
raise ArgumentError, "引数が不正です"
=> ArgumentError
raise ArgumentError.new, "引数が不正です"
=> ArgumentError
バックトレースメソッド
…「p e.backtrace」をソースコード内に記述する。
どのようにエラーが発生したかを確認できる。
example_4.rb
begin
1 / 0
rescue ZeroDivisionError = > e
p e.backtrace
end
フルメッセージメソッド
…「p e.full_message」をソースコード内に記述する。
エラーの発生個所とエラーの発生源を確認できる。
example_5.rb
begin
1 / 0
rescue ZeroDivisionError = > e
p e.full_message
end
上記のメソッド等を用いて例外がシステム上で発生した際に
システムエラーが発生しないようにコードを記載することが大事です。
主な例外クラスの一覧
例外クラス名 | 発生する場面の例 |
---|---|
SyntaxError | 文法エラーがあった場合 |
SignalException | 捕捉していないシグナルを受けた場合 |
ArgumentError | 引数の数が合わない場合や、値が正しくない場合 |
RuntimeError | 特定の例外クラスには該当しないエラーが発生した場合や、例外クラスを省略したraiseの呼び出し |
NameError | 未定義のローカル変数や定数を参照した場合 |
NoMethodError | 未定義のメソッドを呼び出した場合 |
ZeroDivisionError | 整数に対し、整数の0で除算を行った場合 |