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

Pryで例外をスマートに扱う方法|バックトレース表示からカスタマイズまで

Rails開発者なら、Railsコンソールを頻繁に使う方も多いのではないでしょうか。そして今や、RailsコンソールといえばPryが定番。素のIRBと比べると、その使い勝手は段違いです。

実はPryには、例外を扱う際に非常に便利な機能が標準で組み込まれています。この記事では、その中でも特に役立つ3つの機能を紹介します。

直近の例外の完全なバックトレースを表示する

Pry(IRBでも同様)で例外が発生すると、通常は短縮されたバックトレースが表示されます。多くの場合それで十分ですが、詳細を確認したい場面もありますよね。

そんなときは wtf -v コマンドを使いましょう。直近の例外の完全なバックトレースを表示できます。-v フラグを外せば、短縮版のバックトレースが表示されます。

Pryで例外をスマートに扱う方法|バックトレース表示からカスタマイズまで
wtfコマンドで直近のバックトレースにアクセスする

例外オブジェクトのデータにアクセスする

例外には、エラーの原因を突き止めるうえで有用なデータが付随していることがよくあります。IRBではクラス名とエラーメッセージしか確認できませんが、Pryなら実際の例外オブジェクトそのものにアクセスできます。つまり、必要なデータを自由に取り出せるのです。

直近で発生した例外を取得するには、_ex_ 変数を使用します。Ruby組み込みの $! 変数と異なり、rescueブロックの中にいる必要がないのがポイントです。

Pryで例外をスマートに扱う方法|バックトレース表示からカスタマイズまで
_ex_ ローカル変数で直近の例外にアクセスする

例外の表示方法をカスタマイズする

「Pryでは常に完全なバックトレースを見たい」という場合は、デフォルトの例外ハンドラを上書きすればOKです。

~/.pryrc を開いて、以下のように記述しましょう。

# このコードはPryのデフォルト例外ハンドラをもとにしています。
# 元のコード: https://github.com/pry/pry/blob/master/lib/pry.rb

Pry.config.exception_handler = proc do |output, exception, _|
  if UserError === exception && SyntaxError === exception
      output.puts "SyntaxError: #{exception.message.sub(/.*syntax error, */m, '')}"
  else
    output.puts "#{exception.class}: #{exception.message}"
    output.puts "from #{exception.backtrace}"   
  end
end

さらに工夫すれば、「Pry内で発生したすべての例外をHoneybadgerにログとして送信する」といった応用も可能です。ぜひ自分のワークフローに合わせてカスタマイズしてみてください。:)

  1. 【初心者向け】C++の例外処理の仕組みを徹底解説!try・catch・throwの基本から独自例外の作成まで

    C++における例外処理(Exception Handling)とは、プログラムの実行中に発生するエラー(ランタイムエラー)を適切に処理するための仕組みです。例外とは、実行時に送出されるイベントのことを指し、C++ではすべての標準例外が std::exception クラスを基底クラスとして定義されています。 もし例外を捕捉しなければ、プログラムは例外メッセージを出力した後に異常終了してしまいます。例外はハンドリング可能なランタイムエラーであり、適切に処理することでプログラムの堅牢性を大きく向上させることができます。 標準例外クラスの階層構造 C++標準では、例外は <exception&

  2. Rubyでカスタム例外を作成する方法【初心者向けガイド】

    Rubyでは、独自の例外クラスを簡単に作成できます。この記事では、カスタム例外を作るための基本的な手順を、コード例とともにわかりやすく解説します。 1. 新しいクラスを作成する Rubyにおいて、例外も他のオブジェクトと同じくクラスとして定義されています。新しい種類の例外を作りたい場合は、StandardError、あるいはそのサブクラスを継承したクラスを定義するだけでOKです。 class MyError < StandardError end raise MyError 慣例として、新しく作る例外クラスの名前は「Error」で終わるように命名します。また、カスタム例外をモジュ