25

私はいくつかの ruby​​ コードを begin-rescue ブロックでラップして使用していますが、どうにかしてまだクラッシュしています。

コードのブロックは次のようになります。

# Retrieve messages from server
def get_messages
  @connection.select('INBOX')
  @connection.uid_search(['ALL']).each do |uid|
    msg = @connection.uid_fetch(uid,'RFC822').first.attr['RFC822']
    begin
      process_message(msg)
      add_to_processed_folder(uid) if @processed_folder
    rescue
       handle_bogus_message(msg)
    end
    # Mark message as deleted 
    @connection.uid_store(uid, "+FLAGS", [:Seen, :Deleted])
  end
end

このコードを考えると、process_messageまたはadd_to_processed_folderを実行できなかった場合、レスキューが開始され、handle_bogus_messageが呼び出されると想定します。そうは言っても、私はこのコードを本番環境で実行していますが、電子メール メッセージを「取得」すると (これは rake タスクから実行されます)、SyntaxErrorで終了することがあります。

エラー メッセージを確認するには、http://pastie.org/1028479を参照してください。参照しているprocess_messageは、上記のprocess_messageと同じでは ありません。開始-レスキューがこの例外をキャッチしない理由はありますか?

4

2 に答える 2

50

rescueから継承する例外をレスキューするだけStandardErrorです。SyntaxError用途をレスキューするrescue SyntaxError

すべての例外をレスキューするには を使用しますが、ここここで説明されているようrescue Exceptionに、それは悪い考えです (これが のデフォルトの動作ではない理由です) 。特にこの部分:rescue

割り込みをレスキューすると、ユーザーは CTRLC を使用してプログラムを終了できなくなります。

SignalException をレスキューすると、プログラムがシグナルに正しく応答できなくなります。kill -9 以外では殺せません。

于 2010-07-02T18:23:44.490 に答える
3

rescueパラメータなしでは、StandardError クラスによって発生した例外を受け入れます。エラーの種類は SyntaxError で、ScriptError という別のクラスから継承されます。これらのエラー クラスはすべて Exception クラスのサブクラスです。そのため、sepp2k がrescue Exceptionあらゆる種類の例外をキャッチするために使用することを提案しました。

于 2010-07-02T19:46:17.297 に答える