web-dev-qa-db-ja.com

エラーをキャッチしないレスキューを開始します

私はいくつかの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です。 begin-rescueがこの例外をキャッチしない理由はありますか? ?

24
Schneems

パラメータなしのrescueは、StandardErrorから継承する例外をレスキューするだけです。 SyntaxErrorをレスキューするには、rescue SyntaxErrorを使用します。

すべての例外を救済するには、rescue Exceptionを使用しますが、説明されているように、これは悪い考えであることに注意してください(これが、rescueのデフォルトの動作ではない理由です) ここ および- ここ 。特にこの部分:

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

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

47
sepp2k

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

3
Suman Mukherjee