Project

General

Profile

Feature #6647

Updated by hsbt (Hiroshi SHIBATA) about 6 years ago

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: 

 ```rb 
 


 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 
 ```

Back