2012-11-20 12 views
5

catchが深くネストされたコードの外にジャンプするためのものです。たとえばJavaの場合。 Javaのtry-catch例外を処理するためのもの、それはしかし、考えられている貧しいソリューションと同じ達成することが可能であり、また非常に非効率的です。 Rubyでは例外を処理するためにbegin-raise-rescueがありますが、他のタスクにもこれを使用するのは費用がかかります。ルビーキャッチスローと効率

Rubyのcatch-throwは実際にはbegin-raise-rescueより効率的なソリューションですか、それともbegin-raise-rescueの代わりにネストされたブロックを破るために使用する他の理由がありますか?制御構造から抜け出すための「正しい」方法であることに加えて

+0

あなたがについて尋ねている制御構造のいくつかのルビーの例を投稿した場合、あなたが何を意味するか、より明確にすることがあります。 –

答えて

5

catch-throwは(私のテストでは10倍の速さ)大幅に高速化もあります。コードと結果についてはthis gistをご覧ください。

+0

+1ベンチマークのため。 – steenslag

+0

ありがとう!ベンチマークは実際に問題を解決します(私の場合は約15回です!)。キャッチスローは、プログラミングの構造的なスタイルと見なされるべきですか? – wrzasa

+0

あなたのデザインはキャッチスローが必要ですが、おそらくより良いデザインがあります。それは、間違いなく、キャッチスローが特にエンドユーザーがどのようにそれを使用するのかわからないところで宝石を開発することに多くの意味があるエッジケースがあると言われています。 – Josh

5

Josh's answerは正しいです。 catch-throwraise-rescueについての情報を追加したいと思います。

catch-throwがフロー制御に使用され、一方、raise-rescueが例外/エラー処理に使用されます。異なるものは、catch-throw(フロー制御)にはbacktraceは不要です。私を信頼し、主な理由は、raise-rescuebacktraceオブジェクトを作成するために多くの時間を要しているJosh's gistcatch-throw 10倍よりも遅いraise-rescue実行の原因となります。

raise <type>, <message>, <backtrace> 

チェックアウトmy gist:あなたはバックトレースなしraiseにしたい場合は

は、構文を使用します。 raise without backtraceraise with backtraceよりはるかに高速です。

2016年4月の更新:

私はmy gistを更新しました:

新しいRubyのバージョン2.1.8、2.2.4用の試験
  • を追加しましたベンチマークテストの結果を "壊す" 固定
    • 、 2.3.0