Skip to content

Ignoring specific exceptions #67

Open
@andreas

Description

Currently observation values and not observation objects are being passed to ignore. This means it's not possible to ignore transient exceptions that occur in either candidate or control. When an exception occurs, nil is passed as value to ignore for that behavior.

Example:

e = Scientist::Experiment.new "foo"
e.use { rand > 0.001 ? 42 : raise SomeConnectionTimedOut.new }
e.try { rand > 0.001 ? 42 : raise SomeConnectionTimedOut.new }
e.ignore do |control, candidate|
  # control/candidate is nil if exception occurred in that behavior
end

It would be great if ignore received an observation object instead of only the observation value. That would allow examining the exception value.

Example:

# Proposed behavior! This is currently not possible.
ignore do |control, candidate|
  control.exception.is_a?(SomeConnectionTimedOut) ||
    candidate.exception.is_a?(SomeConnectionTimedOut)
end

I currently work around the above issue by rescuing inside try/use and return a sentinel value -- it's a terrible hack though. Would you accept a PR implementing this?

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions