10

私はこのコードを持っています:

begin
  complete_results = Timeout.timeout(4) do      
    results = platform.search(artist, album_name)
  end
rescue Timeout::Error
  puts 'Print me something please'
end 

次に、このコードを含むメソッドを起動します。これがスタック トレースの始まりです。

例外メッセージ: 実行期限切れ
例外バックトレース : /***/****/.rvm/rubies/ruby-1.8.7-p302/lib/ruby/1.8/timeout.rb:64:i

したがって、呼び出しがタイムアウトしたと単純に考えていますが、「印刷してください」は印刷されcomplete_resultsず、タイムアウトステータスの戻り値(ドキュメントに記載されているように、trueまたはfalseのいずれか)であると想定されていますが、ブール値ではありません。

私は何か間違ったことをしていますか?

4

3 に答える 3

21

あなたのコードは正しいです

require 'timeout'
begin
  complete_results = Timeout.timeout(1) do      
   sleep(2)
  end
rescue Timeout::Error
  puts 'Print me something please'
end

「何か印刷してください」と出力します。

上記の基本的なコードを試してください。それが機能する場合は、 に問題がありplatform.searchます。

于 2011-01-09T02:33:28.500 に答える
5

問題は、platform.searchその例外をキャッチしていることTimeout#timeout throwsです。

これを回避するには、内部コードを別のスレッド(YMMV)でラップします。

begin
  complete_results = Timeout.timeout(4) do
    Thread.new{ results = platform.search(artist, album_name) }.value
  end
rescue Timeout::Error
  puts 'Print me something please'
end 
于 2012-05-14T13:18:31.817 に答える
1

ドキュメントによると:

sec 秒が経過する前にブロックの実行が終了すると、true が返されます。そうでない場合は、実行を終了し、例外を発生させます (デフォルトは Timeout::Error です)。

これは、成功した場合にのみ true を返すことを意味します。それ以外の場合、変数は設定されません (つまり、false ではなく nil です)。

あなたの例に関する限り、それは間違いなく私にとってタイムアウトであり、救助の部分に到達しています...

于 2011-01-09T02:34:24.850 に答える