From: KOSAKI Motohiro Date: 2013-09-04T11:25:03-04:00 Subject: [ruby-core:57017] Re: [ruby-trunk - Bug #8730] "rescue Exception" rescues Timeout::ExitException 2013/8/28 nobu (Nobuyoshi Nakada) : > > Issue #8730 has been updated by nobu (Nobuyoshi Nakada). > > > kosaki (Motohiro KOSAKI) wrote: >> > 具体的にはどのように解説されてどう利用されているんでしょうか。 >> >> 残念ながら紙の書籍は手元にありませんが、 >> >> 一番多いのは http://kwfsws.g.hatena.ne.jp/kiwofusi/20111231/1325314356 みたいに >> rescue Exception => e とすると、意図せずタイムアウトも拾ってしまうので注意しましょうという記述。 >> これは "ruby timeout 例外" で検索すると似たような注意は何個も出てきます。 > > なるほど。 > >> 次に出てくるのは逆に、デーモンなどで全部捕まえたいケースで、rescue Timeout::Error, StandardError =>e >> と書きましょう(書いている)という記述 http://d.hatena.ne.jp/dreammind/20090217/1234813224 >> >> 2番めは動かなくなりますよね。 > > Timeout.timeoutから抜けるときには(指定がなければ)Timeout::Errorを投げるので、影響はないですね。 いや、それは blogの誤記だと思いますよ。StandardErrorで捕まえられないエラーがあるからコード変えたという記事なので。 それを最初のメールで補足するべきでしたね。 それに Exception で捕まえてしまうと、SignalExceptionとかも食ってしまうので 一端は捕まえるけど、(ログを吐くなどした後)もう一度raiseするというコードを 書いてない限りは、どの道遅かれ早かれプログラムは誤動作するので、 この修正では問題は解決してないのです。 なので、副作用のほうが気になるわけです。 >> それでどこで議論して、Pros/Consをどう判断した結果なのかとお聞きしました。 > > 意図せずにrescueされてしまう問題点は以前から知られていた問題なので、今回のチケットをきっかけにちょっと試してみたわけです。 > 非互換性として思いついたのは、timeoutされる処理の中でExceptionをrescueしてtimeoutを起こさないようにしていた場合ですが、あるとしたらむしろ意図しないバグだろうと考えました。 > 前者はまさにその一例ですね。 前者がバグであることについては完全に同意します