scientist icon indicating copy to clipboard operation
scientist copied to clipboard

All exceptions — including signals — are caught during an observation

Open djrodgerspryor opened this issue 7 years ago • 0 comments

observation.rb does this:

def initialize(name, experiment, &block)
    ...

    begin
        @value = block.call
    rescue Object => e
        @exception = e
    end

    ...
  end

Which is a well documented anti-pattern. In particular, it means that any signals (eg. <SignalException: SIGTERM>) will be treated as-if they were just an error in the candidate code (which usually means logging and ignoring).

Note: There's no difference between rescue Object and rescue Exception because raising a non-exception (eg. a string) will either raise a <TypeError: exception class/object expected> or a <RuntimeError: Some string>.

I think the standard pattern — rescue StandardError — is correct here. That will catch everything except SignalExceptions and other things which aren't meant to be dealt-with as part of standard error handling.

Although users could filter-out all non-StandardError Exceptions themselves, this feels like a footgun (since signals will be relatively rare — especially in development — most users won't notice any problems until they happen in production).

djrodgerspryor avatar Dec 12 '16 00:12 djrodgerspryor