Section 5/91 menit
5. Kapan Harus Digunakan
5. Kapan Harus Digunakan
Gunakan Typed Throws ketika:
1. Domain layer dengan error yang terdefinisi dengan baik
swift
// Business logic yang punya set error terbatas dan diketahui
enum AuthError: Error {
case invalidCredentials
case accountLocked(until: Date)
case sessionExpired
case insufficientPermissions(required: Permission)
}
func authenticate(username: String, password: String) async throws(AuthError) -> Session {
// Caller tahu persis apa yang bisa salah
}
2. Library/SDK public API
swift
// Pengguna library harus tahu persis error apa yang mungkin terjadi
public enum JSONParserError: Error {
case malformedJSON(offset: Int)
case unexpectedToken(found: Character, expected: String)
case depthLimitExceeded(limit: Int)
}
public func parse(_ data: Data) throws(JSONParserError) -> JSONValue {
// Contract yang jelas dan enforced
}
3. Generic functions yang harus meneruskan error type
swift
// map, filter, reduce, flatMap yang type-preserving
func validate<T, E: Error>(_ values: [T], using validator: (T) throws(E) -> Void) throws(E) {
for value in values {
try validator(value)
}
}
4. Performance-critical code dengan banyak error path
swift
// Parser yang memproses jutaan record — eliminasi heap allocation per-error
func parseRecord(_ bytes: UnsafeBufferPointer<UInt8>) throws(BinaryParseError) -> Record {
// Setiap error tidak perlu boxing — langsung di stack
}
5. Ketika exhaustive handling adalah requirement
swift
// Kamu ingin memastikan caller menangani SETIAP kemungkinan error
// Switch tanpa default — compiler memperingatkan jika ada case baru ditambahkan