Skip to main content

How to rescue all result unhandled exceptions?

Use RescuesResultUnhandledExceptions plugin​

danger

RescuesResultUnhandledExceptions plugin intentionally rescues only StandardErrors, not Exceptions.

info

RescuesResultUnhandledExceptions plugin is especially useful for the Fault Tolerant production environments.

caution

RescuesResultUnhandledExceptions plugin is NOT included in the Standard config by default.

It is up to the end-users to decide whether it is needed for thier applications or not.

Option 1: Modify config to rescue results in all services​

ConvenientService::Dependencies.require_rescues_result_unhandled_exceptions
module ApplicationService
module Config
include ConvenientService::Concern

included do |service_class|
service_class.class_exec do
include ConvenientService::Standard::Config

middlewares :result, scope: :class do
use ConvenientService::Plugins::Service::RescuesResultUnhandledExceptions::Middleware
end
end
end
end
end
class Service
include ApplicationService::Config

def result
raise StandardError, "exception message"
end
end

Option 2: Modify service to rescue results in a single service​

ConvenientService::Dependencies.require_rescues_result_unhandled_exceptions
module ApplicationService
module Config
include ConvenientService::Concern

included do |service_class|
service_class.class_exec do
include ConvenientService::Standard::Config
end
end
end
end
class Service
include ApplicationService::Config

middlewares :result, scope: :class do
use ConvenientService::Plugins::Service::RescuesResultUnhandledExceptions::Middleware
end

def result
raise StandardError, "exception message"
end
end

Result with exception becomes an error​

info

Convenient Service core team strongly believes that it is a responsibility of a developer to predict all possible exceptions reasonably.

That is why the result is an error, not a failure.

result = Service.result
result.success?
puts result.message

Result has access to the original exception object​

info

result.data[:exception] is Ruby's StandardError object that inherits from Exception.

result.data[:exception]
result.data[:exception].class
result.data[:exception].message
result.data[:exception].backtrace.to_a.take(10)
result.data[:exception].cause