私はいくつかの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がこの例外をキャッチしない理由はありますか? ?
パラメータなしのrescue
は、StandardError
から継承する例外をレスキューするだけです。 SyntaxError
をレスキューするには、rescue SyntaxError
を使用します。
すべての例外を救済するには、rescue Exception
を使用しますが、説明されているように、これは悪い考えであることに注意してください(これが、rescue
のデフォルトの動作ではない理由です) ここ および- ここ 。特にこの部分:
割り込みをレスキューすると、ユーザーはCTRLCを使用してプログラムを終了できなくなります。
SignalExceptionをレスキューすると、プログラムがシグナルに正しく応答できなくなります。キル-9以外ではキルできません。
パラメータなしのrescue
は、StandardErrorクラスによって発生した例外を受け入れます。エラータイプはSyntaxErrorで、ScriptErrorという別のクラスから継承されます。これらのエラークラスはすべて、Exceptionクラスのサブクラスです。したがって、sepp2kが提案したように、rescue Exception
あらゆる種類の例外をキャッチします。