There seem to be two problems with set_trace_func (or things I don’t
understand):
-
The following program does not print “done”. It does not raise an
exception. It does set the program’s return code to false.
set_trace_func proc { || }
puts “done”
It’s not a correct program, but I expected an ArgumentError, rather than
a silent exit.
-
The following program does not print the exception or “done”. It does
not raise an exception to the top level. It does set the program’s
return code to false.
set_trace_func proc { |event, file, line, id, binding, classname|
raise “foobar”
}
begin
x = 1
rescue => ex
p ex
end
puts “done”
Is it impossible to safely raise an exception inside of a trace func?
This is in ruby 1.8.4 and 1.8.6.
2007/7/9, Joel VanderWerf [email protected]:
It’s not a correct program, but I expected an ArgumentError, rather than
begin
x = 1
rescue => ex
p ex
end
puts “done”
Is it impossible to safely raise an exception inside of a trace func?
This is in ruby 1.8.4 and 1.8.6.
It does not make sense to allow exceptions to be thrown from
set_trace_func. I do agree however that at least some form of warning
should be generated but I think the exception should be ignored
otherwise. But then again, since set_trace_func is more of a
debugging feature it’s not too important to fix it IMHO.
Kind regards
robert
Robert K. wrote:
…
It does not make sense to allow exceptions to be thrown from
set_trace_func. I do agree however that at least some form of warning
should be generated but I think the exception should be ignored
otherwise. But then again, since set_trace_func is more of a
debugging feature it’s not too important to fix it IMHO.
But set_trace_func has been used for more than debugging
(Binding.of_caller, right?) Arguably, that’s a kludge.
What if you are using set_trace_func as a debugging tool to detect some
problem (memory management, for example), and you want to stop or signal
the program when the problem is detected?
This issue came up for me because I was tinkering with some code for the
“CPU/Memory limiting” thread. I was trying to use set_trace_func in a
stupid way to count “steps” per thread, as a surrogate for cpu cycles,
and raise an exception when a limit was exceeded.
Perhaps this use of exceptions (as a way of signaling back to the
calling code) is not appropriate with set_trace_func. There are other
ways to do this that would work in the context of the “CPU/Memory
limiting” thread.
After thinking about it, I guess the only change I would ask for is some
kind of warning (if running with -w) that an exception happened in the
trace func, rather than a silent exit from the program.