カクカクしかじか

技術的なアレコレ

Rubyにおける例外の握りつぶし手法

はじめに

どうしてもしょうがない時に使う例外の握りつぶし方についてメモ。

例外の握りつぶしとは?

本来エラーで処理が落ちるところを例外をなかったかのように処理を続行させること。
ちなみに当たり前ですが、例外を握りつぶすことで本来の例外が発生しないのでログやエラー検知の対象になりません。
もし例外を握りつぶす場合は、一旦それをすることによる問題がないかどうかを考える必要があります。

やり方

&. を使ったメソッドチェーンは、オーソドックスなパターンなので割愛

今回はrescueを使ったパターンを書いていきます。

具体例

以下はparamsの時刻情報をパースして変数に突っ込むという雑な例です。
rescue nil はその前の処理で例外が発生した場合に処理を止めずに nil を返すという挙動になります。

last_access = Time.zone.parse(params[:last_access]) rescue nil

その他のOSSコード例

RailsActiveRecordのテストコードにも以下のような処理がありました。

activerecord/test/cases/adapters/postgresql/extension_migration_test.rb

class PostgresqlExtensionMigrationTest < ActiveRecord::PostgreSQLTestCase
  <中略>
  def teardown
    ActiveRecord::SchemaMigration.delete_all rescue nil
    <中略>
  end
  <中略>
end

最後に

使わずに済むようだったら、より適切に例外を通知したり、システム上の例外を検知出来るようにすべきですが、こうしたアプローチもあるということを知るのも勉強かなと思うので、色んな面で引き出しを増やして行きたいと思った次第です。