Swift Error Handling: More Than do-catch
Swift gives us several ways to work with failures:
-
throwandtry do-catchResult- Propagating errors through APIs
The key isn't knowing the syntax — it's knowing how to model failures clearly.
https://dkvekariya.medium.com/897fb535f805
Top comments (1)
Bài viết đi sâu vào
throw/do-catchrấ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ùngResult<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: Errorgom mọi lỗi domain, sau đó extensionResultthêmmapError { 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ênAppErrormà 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ằngdeferchạy ngay sau scope hiện tại kết thúc, không chờcatchxong. Nếu trongcatchbạn throw tiếp lỗi mới,defercũ 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