From: Avdi Grimm Date: 2013-09-29T18:34:06-04:00 Subject: [ruby-core:57468] Re: [ruby-trunk - Feature #6647] Exceptions raised in threads should be logged --001a11c2672a71827f04e78d525e Content-Type: text/plain; charset=ISO-8859-1 This would indeed eliminate a huge amount of confusion for people getting started with threads. Or for people years of experience with threads, for that matter... On Fri, Sep 27, 2013 at 7:18 AM, headius (Charles Nutter) < headius@headius.com> wrote: > > Issue #6647 has been updated by headius (Charles Nutter). > > > So, can we do this for 2.1? I have heard from many other users that really > would like exceptions bubbling out of threads to be reported in some way. > We have had numerous bug reports relating to code where threads disappear > without a trace. > ---------------------------------------- > Feature #6647: Exceptions raised in threads should be logged > https://bugs.ruby-lang.org/issues/6647#change-42043 > > Author: headius (Charles Nutter) > Status: Assigned > Priority: Normal > Assignee: matz (Yukihiro Matsumoto) > Category: core > Target version: next minor > > > Many applications and users I have dealt with have run into bugs due to > Ruby's behavior of quietly swallowing exceptions raised in threads. I > believe this is a bug, and threads should always at least log exceptions > that bubble all the way out and terminate them. > > The implementation should be simple, but I'm not yet familiar enough with > the MRI codebase to provide a patch. The exception logging should be logged > in the same way top-level exceptions get logged, but perhaps with > information about the thread that was terminated because of the exception. > > Here is a monkey patch that simulates what I'm hoping to achieve with this > bug: > > > class << Thread > alias old_new new > > def new(*args, &block) > old_new(*args) do |*bargs| > begin > block.call(*bargs) > rescue Exception => e > raise if Thread.abort_on_exception || > Thread.current.abort_on_exception > puts "Thread for block #{block.inspect} terminated with exception: > #{e.message}" > puts e.backtrace.map {|line| " #{line}"} > end > end > end > end > > Thread.new { 1 / 0 }.join > puts "After thread" > > __END__ > > Output: > > system ~/projects/jruby $ ruby thread_error.rb > Thread for block # terminated > with exception: divided by 0 > thread_error.rb:17:in `/' > thread_error.rb:17 > thread_error.rb:7:in `call' > thread_error.rb:7:in `new' > thread_error.rb:5:in `initialize' > thread_error.rb:5:in `old_new' > thread_error.rb:5:in `new' > thread_error.rb:17 > After thread > > > > -- > http://bugs.ruby-lang.org/ > -- Avdi Grimm http://avdi.org I only check email twice a day. to reach me sooner, go to http://awayfind.com/avdi --001a11c2672a71827f04e78d525e Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
This would indeed eliminate a huge amount of confusion for= people getting started with threads. Or for people years of experience wit= h threads, for that matter...


<= div class=3D"gmail_quote"> On Fri, Sep 27, 2013 at 7:18 AM, headius (Charles Nutter) <headius@headi= us.com> wrote:

Issue #6647 has been updated by headius (Charles Nutter).


So, can we do this for 2.1? I have heard from many other users that really = would like exceptions bubbling out of threads to be reported in some way. W= e have had numerous bug reports relating to code where threads disappear wi= thout a trace.
----------------------------------------
Feature #6647: Exceptions raised in threads should be logged
https://bugs.ruby-lang.org/issues/6647#change-42043

Author: headius (Charles Nutter)
Status: Assigned
Priority: Normal
Assignee: matz (Yukihiro Matsumoto)
Category: core
Target version: next minor


Many applications and users I have dealt with have run into bugs due to Rub= y's behavior of quietly swallowing exceptions raised in threads. I beli= eve this is a bug, and threads should always at least log exceptions that b= ubble all the way out and terminate them.

The implementation should be simple, but I'm not yet familiar enough wi= th the MRI codebase to provide a patch. The exception logging should be log= ged in the same way top-level exceptions get logged, but perhaps with infor= mation about the thread that was terminated because of the exception.

Here is a monkey patch that simulates what I'm hoping to achieve with t= his bug:


class << Thread
=A0 alias old_new new

=A0 def new(*args, &block)
=A0 =A0 old_new(*args) do |*bargs|
=A0 =A0 =A0 begin
=A0 =A0 =A0 =A0 block.call(*bargs)
=A0 =A0 =A0 rescue Exception =3D> e
=A0 =A0 =A0 =A0 raise if Thread.abort_on_exception || Thread.current.abort_= on_exception
=A0 =A0 =A0 =A0 puts "Thread for block #{block.inspect} terminated wit= h exception: #{e.message}"
=A0 =A0 =A0 =A0 puts e.backtrace.map {|line| " =A0#{line}"}
=A0 =A0 =A0 end
=A0 =A0 end
=A0 end
end

Thread.new { 1 / 0 }.join
puts "After thread"

__END__

Output:

system ~/projects/jruby $ ruby thread_error.rb
Thread for block #<Proc:0x000000010d008a80@thread_error.rb:17> termin= ated with exception: divided by 0
=A0 thread_error.rb:17:in `/'
=A0 thread_error.rb:17
=A0 thread_error.rb:7:in `call'
=A0 thread_error.rb:7:in `new'
=A0 thread_error.rb:5:in `initialize'
=A0 thread_error.rb:5:in `old_new'
=A0 thread_error.rb:5:in `new'
=A0 thread_error.rb:17
After thread



--
http://bugs.ruby-l= ang.org/



-- Avdi Grimm
http://avdi.o= rg

I only check email twice a day. to reach me sooner, go to http://awayfind.com/avd= i --001a11c2672a71827f04e78d525e--