2011-08-30 2 views
15

ここに状況があります。 doStuff()内のすべての例外がコードをバブルアップして、より高いレベルで処理されるようにします。追加の文字列引数付きのRuby再生成例外

私はまた、任意の例外も同様に高いレベルで)(doStuffに起こっている、と現在はこれをやっているどのくらいの頻度を記録したいと思います:、

begin 
    doStuff() 
rescue Exception => 
    raise e, "specific error to log in a db" 

doStuffコードは例外の数十を投げます私はこれらのイベントのそれぞれをキャプチャしてDBに入れたいと思っています。 doStuff2()もあります。これは同じ命令を投げることができ、どの関数から来たのか知りたいのです。

追加の文字列を追加すると、例外自体が変更されているように見え、元の例外に含まれていたすばらしい書式設定情報とトレース情報が失われます。

元の例外をどのように改善できるかについての提案はありますが、doStuff()内で発生しているすべての例外も追跡できますか?

答えて

48

引数を渡さずにraiseを呼び出すと、Rubyは最後の例外を再発行します。

begin 
    doStuff() 
rescue => e 
    log_exception(e) 
    raise # This will re-raise the last exception. 
end 

補足として、私はRubyのベストプラクティスについていくつか提案したいと思います。

  1. doStuff()方法はRubyの命名規則に従いません。メソッドにアンダースコアを使用する必要があります。 do_stuffをご利用ください。また、引数がない場合は()を使用する必要はありません。
  2. レスキューレスレスではなく、レスキューする必要がある最も低いレベルのクラスを救助してください。ほとんどの場合、あらゆる種類のStandardErrorまたはRuntimeErrorを救いたいかもしれません。実際に、エラータイプを渡さずにレスキューを使用すると、Rubyは自動的にStandardErrorのサブクラスを救済します。 Exceptionクラスは非常に低レベルであり、構文エラーと他のいくつかのコンパイラの問題を検出します。この場合、アプリケーションをクラッシュさせて、破損したアプリケーションをデプロイしないようにすることができます。
+0

doStuffを(上げるために新しい例外を構築することができます。問題はここで例外を記録できないことです。ロギングはより高いレベルで行われなければならない。このアプリは「ダム」で、データベースやログについては何も知らない。私は2つの例外を同時に発生させることはできないことを知っているが、これは私の問題を解決するだろう。それらのうちの1つは捕捉されてログに記録され、もう1つはコード内にまだ泡立ちます。 –

2

新しい例外を発生させて、前の例外とそのスタックトレースをボックスの外に保存することはできません。 Javaの世界からのネストされた例外は残念ながらここにはありません。これはRuby 2.1で利用可能になります。それはかなりの話題です。 https://bugs.ruby-lang.org/issues/8257

まだnesty gemを使用している場合があります。あなたが必要とするのは、例外クラスのinclude Nesty::NestedErrorです。詳しい情報はこちら:https://github.com/skorks/nesty/

3

あなたが最初の例外のバックトレースとメッセージを保存して申し訳ありませんが、ちょうど擬似コードだった)

begin 
rescue Exception => e 
    new_ex = Exception.new("Error while executing ...:#{e.message}") 
    new_ex.set_backtrace(e.backtrace) 
    raise new_ex 
end 
関連する問題