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 #<Proc:0x000000010d008a80 / thread_error.rb:17>  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
>
>
>