Forum: Ruby-core [ruby-trunk - Bug #8730][Open] "rescue Exception" rescues Timeout::ExitException

Cf4991e04c810e8c16f9ddb9378b2c4f?d=identicon&s=25 takiuchi (Genki Takiuchi) (Guest)
on 2013-08-04 02:48
(Received via mailing list)
Issue #8730 has been reported by takiuchi (Genki Takiuchi).

----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730

Author: takiuchi (Genki Takiuchi)
Status: Open
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2013-08-04 03:45
(Received via mailing list)
Issue #8730 has been updated by nobu (Nobuyoshi Nakada).

Status changed from Open to Rejected

Exception全体をrescueして握り潰しているのがバグでしょう。
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-40878

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
02da662c083396641da96c1d32fc86ed?d=identicon&s=25 kosaki (Motohiro KOSAKI) (Guest)
on 2013-08-26 22:07
(Received via mailing list)
Issue #8730 has been updated by kosaki (Motohiro KOSAKI).


ちょっと待った。
現在の挙動は様々な書籍などでも解説されており広く共有されている挙動なので
NEWSも書かずに変えてしまうのは適切じゃないように思います。

そもそもどこで議論した結果?

----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-41352

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2013-08-27 03:43
(Received via mailing list)
Issue #8730 has been updated by nobu (Nobuyoshi Nakada).


具体的にはどのように解説されてどう利用されているんでしょうか。
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-41360

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
02da662c083396641da96c1d32fc86ed?d=identicon&s=25 KOSAKI Motohiro (Guest)
on 2013-08-28 18:44
(Received via mailing list)
> 具体的にはどのように解説されてどう利用されているんでしょうか。

残念ながら紙の書籍は手元にありませんが、

一番多いのは 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番めは動かなくなりますよね。


それでどこで議論して、Pros/Consをどう判断した結果なのかとお聞きしました。
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2013-08-29 05:52
(Received via mailing list)
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を投げるので、影響はないですね。

> それでどこで議論して、Pros/Consをどう判断した結果なのかとお聞きしました。

意図せずにrescueされてしまう問題点は以前から知られていた問題なので、今回のチケットをきっかけにちょっと試してみたわけです。
非互換性として思いついたのは、timeoutされる処理の中でExceptionをrescueしてtimeoutを起こさないようにしていた場合ですが、あるとしたらむしろ意図しないバグだろうと考えました。
前者はまさにその一例ですね。



----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-41400

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
Cf4991e04c810e8c16f9ddb9378b2c4f?d=identicon&s=25 takiuchi (Genki Takiuchi) (Guest)
on 2013-08-31 15:23
(Received via mailing list)
Issue #8730 has been updated by takiuchi (Genki Takiuchi).


以下のコードを見て、rescue Exception がtimeoutの内部処理に影響を与えるという事は
わかりにくいと思いますし、timeoutブロック中で rescue Exceptionしてはいけない、という仕様は
Rubyの仕様として見当たらないので、バグであろうと思います。

timeout 1 do
  begin
    sleep 3
  rescue Exception => e
    puts e.class.superclass #=> "Timeout::ExitException"
  end
end

既知の問題であるということは認識いたしました。
これは Issue #8849 が実装されれば、Thread#raise の代わりに Thread#throw を使うことで
問題の本質的な解決が可能だと思いますが、いかがでしょうか。
あるいは、BasicObject に習い、 BasicException のような従来のExceptionを頂点とした
継承木とは別系統の rescue 可能なクラスを導入することでも解決可能だと思います。
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-41496

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
Cf4991e04c810e8c16f9ddb9378b2c4f?d=identicon&s=25 takiuchi (Genki Takiuchi) (Guest)
on 2013-08-31 15:46
(Received via mailing list)
Issue #8730 has been updated by takiuchi (Genki Takiuchi).


すでに修正されているようなので蛇足気味ですが、

githubなどで公開されているソースコードを調べますと、
rescue Exception を使っているライブラリコードは広く散見され、
書籍などで紹介されている workaround はほとんど浸透していないようです。

この問題の厄介なところは、自分自身が書いたコードだけでなく、利用するライブラリの
コード中にも rescue Exception をしている箇所があると、大外に掛けた timeout が無効化
されてしまう可能性があり、それを予見するのが難しいという点です。

典型的な例としては、以下の様なネットワーク処理を行うライブラリの挙動に
タイムアウトを設定したいというケースがあると思います。

timeout 10 do
  CoolHttpClient.get "http://foo.bar.com"
end

この場合、CoolHttpClient の内部実装のどこかで rescue Exception している箇所が1つでも
あれば、タイミングによっては timeout がもみ消されてしまいます。
他方で、ライブラリ作者としては大外から timeout ブロックで囲われるケースを想定して、
rescue Exception と書いてはならない事になりますが、ここまで来るとやはり
バグであると考えるべきだと思います。
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-41501

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
F24ff61beb80aa5f13371aa22a35619c?d=identicon&s=25 mame (Yusuke Endoh) (Guest)
on 2013-08-31 16:10
(Received via mailing list)
Issue #8730 has been updated by mame (Yusuke Endoh).


timeout の変更自体について特に意見はないのですが。

rescue Exception は timeout に限定した問題ではなく、
exit ができないとか、Ctrl-C が効かないとか、トラブルになりがちです。
大した理由もなくそういうことをしているライブラリには
ちゃんと対応してもらうべきだと思います。

また、throw にすれば万事解決というわけではないです。
ensure を使って例外を差し替えることで同じ現象を引き起こせます。

  timeout 1 do
    begin
      begin
        sleep 3
      ensure
        raise
      end
    rescue
    end
  end

--
Yusuke Endoh <mame@tsg.ne.jp>
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-41502

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
02da662c083396641da96c1d32fc86ed?d=identicon&s=25 KOSAKI Motohiro (Guest)
on 2013-09-04 17:26
(Received via mailing list)
2013/8/28 nobu (Nobuyoshi Nakada) <nobu@ruby-lang.org>:
>> rescue Exception => e
$B$H$9$k$H!"0U?^$;$:%?%$%`%"%&%H$b=&$C$F$7$^$&$N$GCm0U$7$^$7$g$&$H$$$&5-=R!#(B
>> $B$3$l$O(B "ruby timeout $BNc30(B"
$B$G8!:w$9$k$H;w$?$h$&$JCm0U$O2?8D$b=P$F$-$^$9!#(B
>
> $B$J$k$[$I!#(B
>
>> $B<!$K=P$F$/$k$N$O5U$K!"%G!<%b%s$J$I$GA4ItJa$^$($?$$%1!<%9$G!"(Brescue
Timeout::Error, StandardError =>e
>> $B$H=q$-$^$7$g$&!J=q$$$F$$$k!K$H$$$&5-=R(B
http://d.hatena.ne.jp/dreammind/20090217/1234813224
>>
>> $B#2HV$a$OF0$+$J$/$J$j$^$9$h$M!#(B
>
>
Timeout.timeout$B$+$iH4$1$k$H$-$K$O(B($B;XDj$,$J$1$l$P(B)Timeout::Error$B$rEj$2$k$N$G!"1F6A$O$J$$$G$9$M!#(B

$B$$$d!"$=$l$O(B
blog$B$N8m5-$@$H;W$$$^$9$h!#(BStandardError$B$GJa$^$($i$l$J$$%(%i!<$,$"$k$+$i%3!<%IJQ$($?$H$$$&5-;v$J$N$G!#(B

$B$=$l$r:G=i$N%a!<%k$GJdB-$9$k$Y$-$G$7$?$M!#(B

$B$=$l$K(B Exception
$B$GJa$^$($F$7$^$&$H!"(BSignalException$B$H$+$b?)$C$F$7$^$&$N$G(B
$B0lC<$OJa$^$($k$1$I!"!J%m%0$rEG$/$J$I$7$?8e!K$b$&0lEY(Braise$B$9$k$H$$$&%3!<%I$r(B
$B=q$$$F$J$$8B$j$O!"$I$NF;CY$+$lAa$+$l%W%m%0%i%`$O8mF0:n$9$k$N$G!"(B
$B$3$N=$@5$G$OLdBj$O2r7h$7$F$J$$$N$G$9!#(B

$B$J$N$G!"I{:nMQ$N$[$&$,5$$K$J$k$o$1$G$9!#(B


>>
$B$=$l$G$I$3$G5DO@$7$F!"(BPros/Cons$B$r$I$&H=CG$7$?7k2L$J$N$+$H$*J9$-$7$^$7$?!#(B
>
>
$B0U?^$;$:$K(Brescue$B$5$l$F$7$^$&LdBjE@$O0JA0$+$iCN$i$l$F$$$?LdBj$J$N$G!":#2s$N%A%1%C%H$r$-$C$+$1$K$A$g$C$H;n$7$F$_$?$o$1$G$9!#(B
>
$BHs8_49@-$H$7$F;W$$$D$$$?$N$O!"(Btimeout$B$5$l$k=hM}$NCf$G(BException$B$r(Brescue$B$7$F(Btimeout$B$r5/$3$5$J$$$h$&$K$7$F$$$?>l9g$G$9$,!"$"$k$H$7$?$i$`$7$m0U?^$7$J$$%P%0$@$m$&$H9M$($^$7$?!#(B
> $BA0<T$O$^$5$K$=$N0lNc$G$9$M!#(B

$BA0<T$,%P%0$G$"$k$3$H$K$D$$$F$O40A4$KF10U$7$^$9(B
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2013-09-05 09:32
(Received via mailing list)
(13/09/05 0:25), KOSAKI Motohiro wrote:
>>> $B<!$K=P$F$/$k$N$O5U$K!"%G!<%b%s$J$I$GA4ItJa$^$($?$$%1!<%9$G!"(Brescue
Timeout::Error, StandardError =>e
>>> $B$H=q$-$^$7$g$&!J=q$$$F$$$k!K$H$$$&5-=R(B
http://d.hatena.ne.jp/dreammind/20090217/1234813224
>>>
>>> $B#2HV$a$OF0$+$J$/$J$j$^$9$h$M!#(B
>>
>>
Timeout.timeout$B$+$iH4$1$k$H$-$K$O(B($B;XDj$,$J$1$l$P(B)Timeout::Error$B$rEj$2$k$N$G!"1F6A$O$J$$$G$9$M!#(B
>
> $B$$$d!"$=$l$O(B
blog$B$N8m5-$@$H;W$$$^$9$h!#(BStandardError$B$GJa$^$($i$l$J$$%(%i!<$,$"$k$+$i%3!<%IJQ$($?$H$$$&5-;v$J$N$G!#(B

$B$=$N(Bblog$B$K$"$k%3!<%I$G$O!"(Btimeout$B$,H/@8$9$k$N$O(Bnet/http$B$NCf!"Ja$^$($k$N$O30$J$N$G!":#2s$NJQ99$K$h$k1F6A$O$J$$$H$$$&$3$H$G$9!#(B
StandardError$B$GJa$^$($i$l$k$+H]$+$O$3$l$H$O$^$?JL7o$G$9!#(B

> $B$=$l$K(B Exception
$B$GJa$^$($F$7$^$&$H!"(BSignalException$B$H$+$b?)$C$F$7$^$&$N$G(B
>
$B0lC<$OJa$^$($k$1$I!"!J%m%0$rEG$/$J$I$7$?8e!K$b$&0lEY(Braise$B$9$k$H$$$&%3!<%I$r(B
> $B=q$$$F$J$$8B$j$O!"$I$NF;CY$+$lAa$+$l%W%m%0%i%`$O8mF0:n$9$k$N$G!"(B
> $B$3$N=$@5$G$OLdBj$O2r7h$7$F$J$$$N$G$9!#(B
>
> $B$J$N$G!"I{:nMQ$N$[$&$,5$$K$J$k$o$1$G$9!#(B

Exception$B$G4]$4$H0.$j$D$V$7$F$7$^$&$N$,$^$:$$$3$H$O$^$C$?$/F10U$G$9$,!"40A4$G$O$J$$$K$;$h$=$l$rHr$1$i$l$k$[$&$,$$$$$N$G$O$J$$$G$7$g$&$+!#(B
02da662c083396641da96c1d32fc86ed?d=identicon&s=25 KOSAKI Motohiro (Guest)
on 2013-09-12 20:00
(Received via mailing list)
(9/5/13 3:31 AM), Nobuyoshi Nakada wrote:
>
$B$=$N(Bblog$B$K$"$k%3!<%I$G$O!"(Btimeout$B$,H/@8$9$k$N$O(Bnet/http$B$NCf!"Ja$^$($k$N$O30$J$N$G!":#2s$NJQ99$K$h$k1F6A$O$J$$$H$$$&$3$H$G$9!#(B
> StandardError$B$GJa$^$($i$l$k$+H]$+$O$3$l$H$O$^$?JL7o$G$9!#(B

$B$J$k$[$I(B

>> $B$=$l$K(B Exception
$B$GJa$^$($F$7$^$&$H!"(BSignalException$B$H$+$b?)$C$F$7$^$&$N$G(B
>>
$B0lC<$OJa$^$($k$1$I!"!J%m%0$rEG$/$J$I$7$?8e!K$b$&0lEY(Braise$B$9$k$H$$$&%3!<%I$r(B
>> $B=q$$$F$J$$8B$j$O!"$I$NF;CY$+$lAa$+$l%W%m%0%i%`$O8mF0:n$9$k$N$G!"(B
>> $B$3$N=$@5$G$OLdBj$O2r7h$7$F$J$$$N$G$9!#(B
>>
>> $B$J$N$G!"I{:nMQ$N$[$&$,5$$K$J$k$o$1$G$9!#(B
>
>
Exception$B$G4]$4$H0.$j$D$V$7$F$7$^$&$N$,$^$:$$$3$H$O$^$C$?$/F10U$G$9$,!"40A4$G$O$J$$$K$;$h$=$l$rHr$1$i$l$k$[$&$,$$$$$N$G$O$J$$$G$7$g$&$+!#(B

$B<q;]$O$@$$$?$$J,$+$j$^$7$?!#(B
$B$G$O(B
NEWS$B$KDI5-$@$1$7$F$b$i$($^$9$+!#$3$l$G2u$l$k%3!<%I$,$J$$$+$O0MA3$H$7$FITL@$G$9$,!"%j%9%/$ODc$$$H;W$&$N$G(B
$B%"%W%j%1!<%7%g%sB&$rD>$7$F$b$i$&$H$$$&$N$G$$$$$h$&$J5$$,$7$F$-$^$7$?(B
C4e88907313843cf07f6d85ba8162120?d=identicon&s=25 takiuchi (Genki Takiuchi) (Guest)
on 2013-11-22 07:35
(Received via mailing list)
Issue #8730 has been updated by takiuchi (Genki Takiuchi).


rescue Exceptionを使うのはまずいという意見が出ていますが、
例えば以下ようにフィルタ的に全てのexceptionを補足してそのままraiseするような
利用をしたい場合があり、実際に使われています。

begin
  do_something
rescue Exception => e
  log_exception e
  raise e
end

libraryコードの中でこのようなコードが一箇所でもあると、大外からtimeoutを掛ける事が
できないので、やはり従前の挙動は問題が多いと思います。
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-43076

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2013-11-22 07:47
(Received via mailing list)
Issue #8730 has been updated by nobu (Nobuyoshi Nakada).


そういう場合は

  begin
    do_something
  ensure
    log_exception $!
  end

のほうがいいんじゃないかと。
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-43077

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
F1d6cc2b735bfd82c8773172da2aeab9?d=identicon&s=25 Nobuyoshi Nakada (nobu)
on 2013-11-22 07:53
(Received via mailing list)
Issue #8730 has been updated by nobu (Nobuyoshi Nakada).


すいません、常にログしてはだめですね。

  log_exception $! if $!
----------------------------------------
Bug #8730: "rescue Exception" rescues Timeout::ExitException
https://bugs.ruby-lang.org/issues/8730#change-43078

Author: takiuchi (Genki Takiuchi)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version: current: 2.1.0
ruby -v: 2.0.0
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN


=begin
Timeout.timeout ブロック内で rescue Exception によって例外を捕捉している箇所があると、
タイムアウト処理が内部的に利用している Timeout::ExitException クラスの無名派生クラスを補足してしまい、
正しく Timeout::Error が発生しない。

例)

  timeout 1 do
    begin
      sleep 3
    rescue Exception => e
      puts e.class.superclass #=> "Timeout::ExitException"
    end
  end
=end
This topic is locked and can not be replied to.