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