DEV Community

Cover image for Swift Mastery Series — Part 14: Swift Error Handling
divyesh vekariya
divyesh vekariya

Posted on Originally published at dkvekariya.medium.com

Swift Mastery Series — Part 14: Swift Error Handling

Swift Error Handling: More Than do-catch

Swift gives us several ways to work with failures:

  • throw and try
  • do-catch
  • Result
  • Propagating errors through APIs

The key isn't knowing the syntax — it's knowing how to model failures clearly.

https://dkvekariya.medium.com/897fb535f805

#swift #ios #swiftui

Top comments (1)

Collapse
 
traceypears profile image
traceypears •

Bài viết đi sâu vào throw/do-catch rất rõ ràng, nhưng mình thấy còn một góc nhìn thực tế hay bị bỏ qua: dùng Result<Success, Failure> làm kiểu trả về thay vì ném exception khi lỗi là expected (vd: parse JSON, validation input). Nó ép caller phải handle cả hai nhánh tại compile-time, tránh việc quên catch hoặc catch quá rộng (catch { }).

Một pattern hay dùng trong codebase lớn: định nghĩa enum AppError: Error gom mọi lỗi domain, sau đó extension Result thêm mapError { AppError.wrapped($0) } để chuyển lỗi hệ thống (DecodingError, URLError…) về kiểu thống nhất. Làm vậy thì các tầng trên (ViewModel, Coordinator) chỉ pattern-match trên AppError mà không cần import module thấp.

Còn về defer — hay thấy người dùng nó để cleanup resource (close file, unlock), nhưng ít ai nhắc rằng defer chạy ngay sau scope hiện tại kết thúc, không chờ catch xong. Nếu trong catch bạn throw tiếp lỗi mới, defer cũ vẫn chạy trước khi bubble lên — điều này quan trọng khi viết transaction-like logic.

Cuối cùng, try? và try! nên hạn chế tối đa trong production code; nếu buộc dùng, hãy comment lý do (vd: try! FileManager.default.removeItem(at: url) // file tạm, fail thì cũng không ảnh hưởng flow). Code review sẽ dễ bắt được rủi ro hơn PS: the tool I meant is on labagent .tech