class CustomError < StandardError def initialize(e = nil) super e set_backtrace e.backtrace if e end end def run r = Runner.new r.fail end class Runner def fail _fail end def _fail service = RunnerService.new service.fail rescue StandardError => e raise CustomError.new(e) end end class RunnerService def fail _fail end def _fail raise StandardError.new('Service failed') end end begin run rescue CustomError => e puts e.message puts ' ' + e.backtrace.join("\n ") end