3

Rubyで例外のグローバルリスナーを作成することは可能ですか?

StateMachine :: InvalidTransitionのスクリプトですべての例外をキャッチして、アプリケーションがエラーのある電子メールを送信して応答できるようにします。

通常、Rubyでは、レスキューブロックの前にbeginがありますが、上記の例外のすべての例外をキャッチする中央リスナーメソッドが必要です。

これは可能ですか?

本当に置きたくない

begin
    # Do some stuff
rescue StateMachine::InvalidTransition => exception
    # Send error in email message
end 

私がstate_machineに持っているすべてのイベントの内部。

PHPのset_exception_handler()に似たものが必要です。

4

3 に答える 3

1

はい、例外のグローバルリスナーを作成することは可能です。ここに2つのアプローチがあります:

1.at_exitおよび$!

at_exit do
  if $!.is_a? StateMachine::InvalidTransition
    # Send error in email message
  end
end

このアプローチは、スクリプトの終了を停止できないため、クラッシュロガーとしてのみ役立ちます。

2.パッチraisefail

module PatchRaise
  def raise(err, *args)
    if defined?(err.exception) &&
      err.exception.is_a?(StateMachine::InvalidTransition)
      # Send error in email message
    else
      super(err, *args)
    end
  end

  def fail(*args)
    raise(*args)
  end
end

Object.prepend PatchRaise

このアプローチでは、スクリプトが終了するのを防ぐことができますが、他に2つの制限があります。

  • raise/へのすべての呼び出しをキャプチャします。それ以外の場合は、スクリプトの他の場所で/ブロックfailによってキャッチされる可能性がある呼び出しもキャプチャします。beginrescue
  • raiseこれはRubyとメソッドのオーバーライドに依存するため、ネイティブのRubyコアコードまたはC拡張機能(式によってfail発生するなど)によって生成された例外をキャッチしません。ZeroDivisionError1/0
于 2018-03-07T02:24:09.013 に答える
-2

すべてを開始/レスキュー/終了でラップできます。そのようです:

begin
    class Sheep
        def self.raise_me
             raise
        end
    end
    Sheep.raise_me
rescue
    p 'caught!'
end

私はあなたがしたいかどうかわからない

于 2013-02-26T13:23:54.390 に答える
-2

Errbitのソースを見たことがありますか?これはあなたが探している機能を持っているかもしれません。

Errbit

個人的には、賢く回復するのではなく、大規模に失敗し、(肉空間で)応答を処理する方法を用意する必要があると思います。そのように引っ張っている髪が多すぎます。:-)

また、これはあなたにとっても良い参考になるかもしれません。

並外れたルビーブック

幸運を!

更新:2017年1月23日

最近なぜこれが反対票を投じられたのか私にはわかりません。私はまだ本番環境で「大失敗」を待機し、他のシステムで応答を処理します。これは、賢いRubyistsのカーゴカルトに反する可能性がありますが、本番環境では、これが通常行われる方法です。主な理由は、実際に他の人のプロダクションコードで作業を開始すると、テストや仕様が不足し、マネージャーが開発者の首をかしげたり、任意の期限が原因で、ほとんどがその場で作成されるためです。

IMOは、エラーを巧妙に処理しないことをお勧めします。つまり、例外パスを通過したときにアプリを稼働させ続けるグローバルなcatchメソッドです。これにより、システムにサイレントエラーが発生します。このエラーについては、気付くことさえなく、TDDコードカバレッジが十分に得られない可能性があります。エラーをグローバルにキャッチすることは、一貫した稼働時間には最適ですが、システムで何が起こっているのかを知ることを妨げます。優れた統合テストコードカバレッジを実装する場合、これは問題にはなりません。

また、私はこの宝石、Contractsに出くわしました。これは書かれていて、コードカバレッジが良好であるため、コードカバレッジが不十分でランダムなリターンに関連する例外を大幅に排除するのに役立ちます。

更新:2017年3月8日

私は以前の更新で、これが包括的な質問、つまりrubyアプリケーションの例外を「リッスン」するものを実装する方法を解決することを支持します。

時々あなたは質問をし、答えは接線です、すなわちより良い方法があります。Stack Overflowは、他の人の経験を活用することです。コードゴルフはその場所を持っていますが、ほとんどの場合不要です。

Errbitは、オープンソースのAirbrake APIとRailsに基づくオープンソースの例外キャッチャーであり、かなり迅速に立ち上がることができ、ソリューションを手動でコーディングするよりもはるかに多くのオプションを提供します。したがって、それを却下することは間違ったIMOです。

例外的なRubyBookは、お金がかかるため、無関係なリソースです。私の意見では、作者があなたのツールセットの作成と付加価値に時間を費やした作品の支払いを要求することは完全に受け入れられます。本の価格が高すぎる場合は、地元の図書館にコピーを入手するように依頼してください。そういうわけで、それらは存在します。それが失敗した場合は、Avdiに連絡してください。おそらく合意に達することができます。

于 2013-02-26T13:34:52.760 に答える