Exception: BetterService::BetterServiceError

Inherits:
StandardError
  • Object
show all
Defined in:
lib/better_service/errors/better_service_error.rb

Overview

Base exception class for all BetterService errors

This class provides rich error information including error codes, context, original errors, and structured metadata for debugging and logging.

Examples:

Basic usage

raise BetterServiceError.new(
  "Something went wrong",
  code: :custom_error,
  context: { user_id: 123, action: "create" }
)

With original error

begin
  dangerous_operation
rescue StandardError => e
  raise BetterServiceError.new(
    "Operation failed",
    code: :operation_failed,
    original_error: e,
    context: { operation: "dangerous_operation" }
  )
end

Accessing error information

begin
  service.call
rescue BetterServiceError => e
  logger.error e.to_h
  # => {
  #   error_class: "BetterService::Errors::Runtime::ValidationError",
  #   message: "Validation failed",
  #   code: :validation_failed,
  #   timestamp: "2025-11-09T10:30:00Z",
  #   context: { service: "UserService", validation_errors: {...} },
  #   original_error: nil,
  #   backtrace: [...]
  # }
end

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(message = nil, code: nil, original_error: nil, context: {}) ⇒ BetterServiceError

Initialize a new BetterService error

Parameters:

  • message (String, nil) (defaults to: nil)

    Human-readable error message

  • code (Symbol, nil) (defaults to: nil)

    Error code for programmatic handling

  • original_error (Exception, nil) (defaults to: nil)

    Original exception that caused this error

  • context (Hash) (defaults to: {})

    Additional context about the error (service name, params, etc.)



62
63
64
65
66
67
68
# File 'lib/better_service/errors/better_service_error.rb', line 62

def initialize(message = nil, code: nil, original_error: nil, context: {})
  super(message)
  @code = code
  @original_error = original_error
  @context = context || {}
  @timestamp = Time.current
end

Instance Attribute Details

#codeSymbol? (readonly)

Returns Error code for programmatic handling.

Returns:

  • (Symbol, nil)

    Error code for programmatic handling



45
46
47
# File 'lib/better_service/errors/better_service_error.rb', line 45

def code
  @code
end

#contextHash (readonly)

Returns Additional context about the error.

Returns:

  • (Hash)

    Additional context about the error



51
52
53
# File 'lib/better_service/errors/better_service_error.rb', line 51

def context
  @context
end

#original_errorException? (readonly)

Returns Original exception that caused this error.

Returns:

  • (Exception, nil)

    Original exception that caused this error



48
49
50
# File 'lib/better_service/errors/better_service_error.rb', line 48

def original_error
  @original_error
end

#timestampTime (readonly)

Returns When the error was raised.

Returns:

  • (Time)

    When the error was raised



54
55
56
# File 'lib/better_service/errors/better_service_error.rb', line 54

def timestamp
  @timestamp
end

Instance Method Details

#backtraceArray<String>

Override backtrace to include original error’s backtrace

Returns:

  • (Array<String>)

    Combined backtrace



106
107
108
109
110
111
112
113
114
# File 'lib/better_service/errors/better_service_error.rb', line 106

def backtrace
  trace = super || []

  if original_error && original_error.backtrace
    trace + [ "--- Original Error Backtrace ---" ] + original_error.backtrace
  else
    trace
  end
end

#detailed_messageString

Get detailed error message with context

Returns:

  • (String)

    Detailed message including context



88
89
90
91
92
93
94
# File 'lib/better_service/errors/better_service_error.rb', line 88

def detailed_message
  parts = [ message ]
  parts << "Code: #{code}" if code
  parts << "Context: #{context.inspect}" if context.any?
  parts << "Original: #{original_error.class.name}: #{original_error.message}" if original_error
  parts.join(" | ")
end

#inspectString

Enhanced inspect for debugging

Returns:

  • (String)

    Detailed string representation



99
100
101
# File 'lib/better_service/errors/better_service_error.rb', line 99

def inspect
  "#<#{self.class.name}: #{detailed_message}>"
end

#to_hHash

Convert error to a structured hash

Returns:

  • (Hash)

    Hash representation with all error information



73
74
75
76
77
78
79
80
81
82
83
# File 'lib/better_service/errors/better_service_error.rb', line 73

def to_h
  {
    error_class: self.class.name,
    message: message,
    code: code,
    timestamp: timestamp.iso8601,
    context: context,
    original_error: original_error_info,
    backtrace: backtrace&.first(10) || []
  }
end