Project

General

Profile

Actions

Bug #14479

closed

Exceptions raised from a :call tracepoint can sometimes be "rescued" inside the method

Added by dazuma (Daniel Azuma) over 3 years ago. Updated 11 days ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
[ruby-core:85574]

Description

This is a Ruby 2.5 regression.

If you raise an exception from a :call tracepoint, it can, in certain circumstances, be caught by a rescue block inside the called method. Here is an illustration:

def foo
  begin
    puts "hi"
  rescue => e
    puts "In rescue"
  end
end

TracePoint.trace :call do |tp|
  raise "kaboom" if tp.method_id == :foo
end

foo

In Ruby 2.4.3, this results in the exception as expected.
In Ruby 2.5.0, this results in "in rescue" being printed to the console. The rescue block inside method "foo" is catching the exception.

This is highly dependent on the positioning of the rescue block in the method, and may be related to which bytecode is flagged with the trace flag. For example, the following method "foo" raises the exception in Ruby 2.5.0:

def foo
  puts "hi"
  begin
    puts "hi"
  rescue => e
    puts "In rescue"
  end
end

Here are three more interesting variants that should be considered:

def foo
  if true
    begin
      puts "hi"
    rescue => e
      puts "In rescue"
    end
  end
end

Prints "in rescue"

def foo
  if false
    begin
      puts "hi"
    rescue => e
      puts "In rescue"
    end
  end
end

Raises the exception

def foo
  if false
    begin
      puts "hi"
    rescue => e
      puts "In rescue"
    end
  end
  1
end

Segfaults!

Updated by jeremyevans0 (Jeremy Evans) 3 months ago

This is still an issue in the master branch. I've submitted a pull request that should fix the problem: https://github.com/ruby/ruby/pull/4578

Actions #2

Updated by ko1 (Koichi Sasada) 14 days ago

  • Description updated (diff)

Updated by ko1 (Koichi Sasada) 11 days ago

  • Status changed from Open to Rejected

I want to reject this issue because of the following reasons:

  • TracePoint block shouldn't raise an exception. TracePoint should not hurt non-hook (99.99..% case) execution if possible. I don't think this difference is not a matter.
  • Now Ruby 2.4 is obsolete version (current last supported version is Ruby 2.6), so it also the change from stable versions if it was changed. I propose to change the definition of call event is "It invokes just before the first line in a method" from Ruby 2.4.
def foo
  # invoike here before 2.4
  begin
   # invoke here from 2.5
   foo
  rescue
   ...
  end
end

Please reopen this issue if it is needed.

Actions

Also available in: Atom PDF