Swift Error Handling
Priority: P0
Workflow: Add Error Handling to a Swift Function
- Define a custom error enum conforming to
Error - Mark the function
throws(orasync throws) - Use
do-catchat the call site with specific catch clauses - Map domain errors to user-facing messages at the presentation layer
Implementation Guidelines
Throwing Functions
- Propagate Errors: Use
throwsfor recoverable errors andasync throwsfor modern concurrency. - Do-Catch: Handle errors close to source with specific catch clauses for each error type. Catch-all
catchshould be the last resort. - Error Types: Define custom errors as enums conforming to
Error:
See implementation examples for custom error enums, do-catch patterns, and Result type usage.
- Optional Try: Use
try?only for non-critical errors where nil is acceptable.
Result Type
- Async Alternatives: Use
throwsfor synchronous code. UseResultfor callbacks and non-async deferred error states. - Transformations: Use
.map(),.flatMap()for functional composition. - Conversion: Use
.get()to convertResultto throwing for use intry-catch.
Never Type & Preconditions
- Fatalisms: Use
Neverreturn type only for unrecoverable crash scenarios or to indicate unreachable code. Never for expected errors. - Preconditions: Use
precondition(),assert(), andfatalError()for programmer errors. UseassertionFailure()for debug-only checks.
Anti-Patterns
- No try!: Use
try?ordo-catch. - No try? without nil check: Handle or log.
- No Error(message): Use typed errors.