2011-06-20 7 views
9

私は例外的な状況を除いて例外の使用を避けることを提唱したブログ投稿JRuby Performance: Exceptions are not flow controlを読んだ。Ruby用のLoadErrorを救済する代替手段はありますか?

私は、Rescueを使用して定期的にLoadErrorsを処理することに罪があることを認識しました。

requireの代替ファイルが存在する場合はファイルをロードしようとしますが、存在しない場合は例外をスローしませんか?

背景:あなたは「なぜあなたは持っているあなたが絶対に必要としないことが必要です?」迷っている場合は、ここに私の話です:

  1. 私はルビー1.8のプログラミングましたが、私はrequire "rdoc/usage"を使用コマンドラインアプリケーションで正しい数のパラメータを入力しなかった場合、使用方法の情報を提供できるようになりました。これにより、すぐに使用できる1.9の例外がスローされます。
  2. 私のアプリケーションの一部には、Windowsデスクトップ上でwin32oleを操作するコードが含まれています。これにより、関係するファイルが、重い計算作業を行うLinuxサーバーで実行された場合に、LoadErrorが発生します。 win32oleを使用するファイルには、テストスイートでテストされる他のコードも含まれています。したがって、Linux上でテストスイートを実行する場合、それらのファイルを必要とします。私はそのようなファイルを分けなければならないが、それはヤク剃りのようである。
+0

私は非常に似たユースケースを持っています(つまり、ツール内のオプションの拡張子)。私は、LoadErrorがこれを行う唯一の方法であるかどうか不思議です。 –

+8

この記事では、* Railsのリクエストごとに*数百回の例外が発生した場合について説明していますが、プログラムの全ライフタイム中に* 2回*例外を1回*発生させることについて話しています。 –

答えて

2

requireが呼び出される前に失敗するかどうかを判断しようとするよりも、最初のケースの例外を使用するほうが、おそらく問題ありません。あなたがやっていることが何かをオプションでロードしようとしているのであれば(あるいは、同じことをするいくつかの異なるライブラリをサポートする必要があります)、ロードして例外を処理しようとすると、うまく、うまく、

2番目のケースでは、OLEのようなプラットフォーム固有の処理を実行する前に、RUBY_PLATFORMまたはsys-unameをチェックする方が意味があります。時々、ヤクはシェービングが必要です。これは、あなたがWindowsを利用しているなら、本当に必要なものにしたいのですが、Linuxを使っているのであれば、まったく必要としたくないのです。例外自体ではなく例外の副作用を使用しています。

時には、人々は例外のトラップ可能なジャンプとして使用しようとします。例外は、一般的なイベント通知システムではなく、回復不能なエラー状態を対象としています。 goto(すなわちフロー制御)としての例外の使用は、例外処理システムの悪用であり、フロー制御の例外を使用するシステムを構築する人々は、通常、病院で終わる(「落ちる」、ハンマーの箱に入る、行)。

+0

あなたは実際にはRUBY_PLATFORMを使用しませんが、何を意味するのですか。 –

+0

@Andrew:私は 'RUBY_PLATFORM'が少し推測されたように、クロスプラットフォームのRubyの問題に取り組む必要はありませんでした.AFAIKはJRubyに問題があるので、より明示的なもの(sys-unameなど)アイディア。 –

7

コンピュータプログラムはほとんどすべての時間をループで消費します。プログラムの実行中に何百万回も実行される内部ループで例外を繰り返し発生させたり救済したりする場合、パフォーマンスの問題が本当に発生する可能性があります。しかし、ファイルの読み込みは、通常はプログラムの初期化時にのみ行われるものです。プログラムの起動中にいくつかの例外を発生させて救助した場合、パフォーマンスへの影響は誰にも気付かれないほどゼロに近づきます。

ところで、本当にパフォーマンスに敏感な(つまり何度も実行される)メソッドがありますが、複数のブロックから飛び越して呼び出しスタックを飛び越えることができる "goto"が必要な場合(例外のように)、throwcatchを使用します。それらはraiseおよびrescueに似ていますが、はるかに高速です。例外を発生させるためのパフォーマンスコストの大半は、スタックトレースの埋め込みから来ており、throwはそうしていません。

IMHO、begin; require "..."; rescue LoadErrorは、慣習的なRubyであり、「フロー制御の例外の使用」について人々が何を言っているかにかかわらず、決して悪い習慣とはみなされません。あなたのスクリプトが通常Windows上で実行されている場合、Linux上で実行することは「例外的条件」と見なすことができ、例外を使用する価値があります。一般に、ロードしたいファイルがない場合、それは "例外的な条件"です - そのため、requireが最初に例外を発生させます!

あなたの頭を高くしてください!シンプルで常識的なコードを使用していると嫌悪感を感じさせないでください!

関連する問題