Skip to main content

How to check whether the result comes from an unhandled exception?

warning

The functionality described on this page is available from v0.20.

The Result#from_unhandled_exception? and Result#exception methods answer this question.

Consider the following regular service.

class Service
include ConvenientService::Standard::Config
include ConvenientService::FaultTolerance::Config

def result
success
end
end

It uses the FaultTolerance configuration to automatically rescue all unhandled exceptions and convert them to error results.

In this example, it just returns a success.

result = Service.result
# => <Service::Result status: :success>

So when we query whether the result is from an unhandled exception or not it gives us false.

result.from_unhandled_exception?
# => false

And result.unhandled_exception returns nil respectively.

result.unhandled_exception
# => nil

Let's have a look at other service.

class OtherService
include ConvenientService::Standard::Config
include ConvenientService::FaultTolerance::Config

def result
16 / 0

success
end
end

It intentionally divides 16 by 0 to cause an unhandled exception.

When we invoke the OtherService result, that exception is automatically rescued by the FaultTolerance configuration and converted into error.

result = OtherService.result
# => <OtherService::Result status: :error data_keys: [:exception] message: "ZeroDivisionError...">

Now from_unhandled_exception returns true.

result.from_unhandled_exception?
# => true

And result.unhandled_exception gives access to the original Ruby exception.

result.unhandled_exception
# => #<ZeroDivisionError: divided by 0>
warning

The FaultTolerance configuration rescues only StandardError descendants, not direct Exception descendants, since they are reserved by Ruby.