Error Handling¶
PromptManager provides comprehensive error handling to help you identify and resolve issues during prompt processing.
Common Exceptions¶
PromptNotFoundError
¶
Raised when a prompt cannot be located:
begin
prompt = PromptManager::Prompt.new(id: 'nonexistent_prompt')
rescue PromptManager::PromptNotFoundError => e
puts "Prompt not found: #{e.message}"
# Handle gracefully - perhaps show available prompts
end
MissingParametersError
¶
Raised when required parameters are not provided:
begin
result = prompt.render # Missing required parameters
rescue PromptManager::MissingParametersError => e
puts "Missing parameters: #{e.missing_parameters.join(', ')}"
# Prompt user for missing values
end
DirectiveProcessingError
¶
Raised when directive processing fails:
begin
result = prompt.render
rescue PromptManager::DirectiveProcessingError => e
puts "Directive error: #{e.message}"
puts "Line: #{e.line_number}" if e.respond_to?(:line_number)
end
StorageError
¶
Raised when storage operations fail:
begin
prompt = PromptManager::Prompt.new(id: 'my_prompt')
rescue PromptManager::StorageError => e
puts "Storage error: #{e.message}"
# Check file permissions, disk space, etc.
end
Error Recovery Strategies¶
Graceful Degradation¶
def safe_render_prompt(prompt_id, params = {})
begin
prompt = PromptManager::Prompt.new(id: prompt_id)
prompt.render(params)
rescue PromptManager::PromptNotFoundError
"Default response when prompt is unavailable"
rescue PromptManager::MissingParametersError => e
"Please provide: #{e.missing_parameters.join(', ')}"
rescue => e
logger.error "Unexpected error rendering prompt: #{e.message}"
"An error occurred processing your request"
end
end
Retry Logic¶
def render_with_retry(prompt, params, max_retries: 3)
retries = 0
begin
prompt.render(params)
rescue PromptManager::StorageError => e
retries += 1
if retries <= max_retries
sleep(0.5 * retries) # Exponential backoff
retry
else
raise e
end
end
end
Validation and Prevention¶
Parameter Validation¶
def validate_parameters(params, required_params)
missing = required_params - params.keys
unless missing.empty?
raise PromptManager::MissingParametersError.new(
"Missing required parameters: #{missing.join(', ')}",
missing_parameters: missing
)
end
end
# Usage
validate_parameters(user_params, [:customer_name, :order_id])
Pre-flight Checks¶
def preflight_check(prompt_id)
# Check if prompt exists
unless PromptManager.storage.exist?(prompt_id)
raise PromptManager::PromptNotFoundError, "Prompt '#{prompt_id}' not found"
end
# Check for circular includes
check_circular_includes(prompt_id)
# Validate syntax
validate_prompt_syntax(prompt_id)
end
Logging and Debugging¶
Enable Debug Logging¶
Custom Error Handlers¶
PromptManager.configure do |config|
config.error_handler = ->(error, context) {
# Custom error handling
ErrorReporter.notify(error, context: context)
# Return fallback response
case error
when PromptManager::PromptNotFoundError
"Prompt temporarily unavailable"
when PromptManager::MissingParametersError
"Please check your input parameters"
else
"Service temporarily unavailable"
end
}
end
Testing Error Conditions¶
RSpec Examples¶
describe "Error handling" do
it "handles missing prompts gracefully" do
expect {
PromptManager::Prompt.new(id: 'nonexistent')
}.to raise_error(PromptManager::PromptNotFoundError)
end
it "validates required parameters" do
prompt = PromptManager::Prompt.new(id: 'test_prompt')
expect {
prompt.render # No parameters provided
}.to raise_error(PromptManager::MissingParametersError)
end
end
Best Practices¶
- Always Handle Exceptions: Never let PromptManager exceptions bubble up unhandled
- Provide Meaningful Fallbacks: Return sensible defaults when prompts fail
- Log Errors: Capture error details for debugging and monitoring
- Validate Early: Check parameters and conditions before processing
- Test Error Paths: Include error scenarios in your test suite
- Monitor in Production: Set up alerts for prompt processing failures