Swift Error Handling
Priority: P0
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
enumconforming to Error (e.g.,enum NetworkError: Error { case connectionLost }) for user-facing descriptions. - Optional Try: Use
try?only for non-critical errors.
Result Type
- Async Alternatives: Use throws for synchronous code. Use Result for 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? or do-catch.
- No try? without nil check: Handle or log.
- No Error(message): Use typed errors.
References
- Error Types & Result