Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyで例外にコンテキストデータを追加する3つの方法

標準のバックトレースやエラーメッセージだけでは、エラーの原因を特定するのに十分な情報が得られないことがあります。そんなときに役立つのが、例外への追加データの付与です。幸い、Rubyではこれをとても簡単に実現できます。

エラーメッセージをカスタマイズする

例外にコンテキスト情報を加える最もシンプルな方法は、メッセージそのものに情報を組み込んでしまうことです。次の例では、発生した例外を捕捉し、新しいメッセージを付けて再送出しています。

begin
  raise "foo"
rescue => e
  raise e.class, "bar"
end

# RuntimeError: bar

この手法が特に活躍するのは、テンプレートをレンダリングする場面です。テンプレート内部で発生した例外は、それがどのファイルで起きたのかという情報を持ちません。しかしデバッグの際には、このファイル名こそが重要な手がかりになります。

以下は、テンプレートのエラーを捕捉し、メッセージの先頭にファイル名を付けて再送出する例です。

filename = "mytemplate.erb"
template = File.read(filename) # "<% 1/0 %>" という内容が入っているものとする

e = ERB.new(template)

begin
  e.result
rescue => e
  raise e.class, [filename, e.message].join(": ")
end

# ZeroDivisionError: mytemplate.erb: divided by 0

例外をラップする

もうひとつの選択肢は、独自のカスタム例外クラスを作成することです。Rubyにおいて例外クラスも他のクラスと同じく普通のクラスなので、attr_readerattr_accessor を必要なだけ自由に追加できます。

class TemplateError < StandardError
  attr_reader :filename

  def initialize(msg, filename)
    @filename = filename
    super(msg)
  end
end

begin
  ERB.new(template).result
rescue => e
  raise TemplateError.new(e.message, filename)
end

このようにすれば、メッセージ文字列に頼らずとも、e.filename のように構造化された形でコンテキスト情報へアクセスできるようになり、ログ解析や条件分岐にも活用しやすくなります。

Honeybadgerのcontext機能を使う

最後に少しだけご紹介。エラートラッキングサービスのHoneybadgerには、例外へコンテキスト情報を追加するための便利な機能が用意されています。例外オブジェクトを書き換える必要はなく、アプリケーションの任意の場所で Honeybadger.context メソッドを呼び出すだけです。

class ApplicationController

  # ...

  def find_current_user
    user = ...
    Honeybadger.context(user_id: user.id, user_email: user.email, scope: "user")
  end

end

例外が発生すると、事前に設定しておいたコンテキストデータが自動的に一緒にレポートされます。Webダッシュボードやモバイルアプリから、その他の例外情報とあわせてこれらのデータを確認できます。

Rubyで例外にコンテキストデータを追加する3つの方法 Honeybadgerのcontext機能を使えば、ほんの数行のコードで必要な情報を例外に添付できます。

まとめ

例外にコンテキスト情報を追加する方法は、主に次の3つがあります。

  • メッセージのカスタマイズ: 手軽に実装できるが、情報は文字列としてしか扱えない
  • カスタム例外クラス: 構造化されたデータを保持でき、プログラムから参照しやすい
  • Honeybadgerのcontext機能: アプリケーション全体の状態を簡単に記録でき、エラー監視との相性が抜群

状況に応じてこれらを使い分けることで、デバッグの効率は大きく向上します。まずは手軽なメッセージのカスタマイズから試してみてはいかがでしょうか。

  1. Windows 11でコンテキストメニューを透明化する方法

    Windows 11といえば、デザインとユーザーインターフェースの大幅な進化がまず目につきます。数々の新機能の中でも、コンテキストメニューを透明にできる点は見逃せないポイントです。 本記事では、Windows 11でコンテキストメニューを透明化する具体的な手順を、ステップバイステップでわかりやすく解説します。 Windows 11でコンテキストメニューを透明にする方法 はじめに用語の確認です。Windowsにおける「コンテキストメニュー」とは、マウスを右クリックしたときに表示されるショートカットメニューのことです。右クリックメニューとも呼ばれます。 Windows 11では、スタートメニューや

  2. Windows 11でコンテキストメニューを透明化する方法

    Windows 11といえば、デザインやユーザーインターフェースの大幅な進化が何より目を引きます。数々の新機能の中でも、スタートメニューやタスクバーを半透明にできる「透明効果」は特に人気ですが、実はコンテキストメニューも透明化できることをご存じでしょうか。 この記事では、Windows 11のコンテキストメニューを透明化する方法を、初心者の方にもわかりやすくステップバイステップで解説していきます。 コンテキストメニューとは まず前提として、コンテキストメニューとは、グラフィカルユーザーインターフェース(GUI)上でマウスを右クリックした際に表示されるショートカットメニューのことです。「右クリッ