From: Alex Young Date: 2012-10-15T18:18:41+09:00 Subject: [ruby-core:48000] Re: [ruby-trunk - Bug #6647] Exceptions raised in threads should be logged On 15/10/12 03:24, kosaki (Motohiro KOSAKI) wrote: > > Issue #6647 has been updated by kosaki (Motohiro KOSAKI). > > > I think "exception raised" callback is better way because an ideal output (both format and output device) depend on an application. It should be passed a raised exception. This, along with a sensible default that displays *something* to stderr, would be absolutely ideal from my point of view. -- Alex > ---------------------------------------- > Bug #6647: Exceptions raised in threads should be logged > https://bugs.ruby-lang.org/issues/6647#change-30689 > > Author: headius (Charles Nutter) > Status: Assigned > Priority: Normal > Assignee: matz (Yukihiro Matsumoto) > Category: core > Target version: 2.0.0 > ruby -v: head > > > 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 > > >