We use the Error protocol to create custom error types. This helps us handle mistakes in our programs clearly and safely.
Error protocol conformance in Swift
enum MyError: Error { case somethingWentWrong case invalidInput(reason: String) }
You usually create an enum that follows the Error protocol.
Each case represents a different kind of error you want to handle.
enum NetworkError: Error { case badURL case timeout case unknown }
struct FileError: Error { let message: String }
enum ValidationError: Error { case emptyField(fieldName: String) case invalidEmail }
This program defines a LoginError enum that conforms to Error. The login function throws errors if the user or password is wrong. We use do-try-catch to handle these errors and print messages.
enum LoginError: Error { case userNotFound case wrongPassword } func login(user: String, password: String) throws -> String { if user != "admin" { throw LoginError.userNotFound } if password != "1234" { throw LoginError.wrongPassword } return "Welcome, \(user)!" } // Using the function with error handling do { let message = try login(user: "admin", password: "1234") print(message) } catch LoginError.userNotFound { print("Error: User not found.") } catch LoginError.wrongPassword { print("Error: Wrong password.") } catch { print("Unknown error.") }
Only types that conform to the Error protocol can be thrown as errors.
Using enums for errors is common because they clearly list all possible errors.
Remember to handle errors with do-try-catch to avoid crashes.
The Error protocol lets you create your own error types.
Enums are a simple way to list different errors.
Use throw and catch to manage errors safely in your code.
Practice
Error protocol in Swift?Solution
Step 1: Understand the role of the Error protocol
The Error protocol is designed to let developers define their own error types in Swift.Step 2: Identify the purpose of custom error types
Custom error types allow throwing and catching specific errors in code, improving error handling.Final Answer:
To define custom error types that can be thrown and caught -> Option DQuick Check:
Error protocol = custom error types [OK]
- Confusing Error protocol with UI or memory management
- Thinking Error protocol manages network connections
- Assuming Error protocol is for general programming tasks
Error protocol?Solution
Step 1: Check enum conformance syntax
To conform to the Error protocol, the enum must explicitly declare: Errorafter its name.Step 2: Verify the enum cases
The cases can be simple without raw values; raw values are optional and unrelated to Error conformance.Final Answer:
enum NetworkError: Error { case disconnected, timeout } -> Option AQuick Check:
Enum conforming to Error = enum Name: Error { cases } [OK]
- Omitting ': Error' conformance
- Using raw value types without conforming to Error
- Confusing enum raw types with protocol conformance
enum FileError: Error {
case notFound
case unreadable
}
func readFile(_ name: String) throws -> String {
if name == "missing.txt" {
throw FileError.notFound
}
return "File content"
}
do {
let content = try readFile("missing.txt")
print(content)
} catch FileError.notFound {
print("File not found error caught")
} catch {
print("Other error")
}Solution
Step 1: Analyze the function behavior
The function throwsFileError.notFoundwhen the filename is "missing.txt".Step 2: Check the do-catch block
The catch block specifically catchesFileError.notFoundand prints "File not found error caught".Final Answer:
File not found error caught -> Option AQuick Check:
Throw and catch specific error = prints catch message [OK]
- Expecting function to return normally
- Ignoring specific catch and expecting generic catch
- Confusing error thrown with error caught
enum LoginError: Error {
case invalidUsername
case invalidPassword
}
func login(user: String, password: String) throws {
if user.isEmpty {
throw LoginError.invalidUsername
} else if password.isEmpty {
throw LoginError.invalidPassword
}
}
try login(user: "", password: "1234")Solution
Step 1: Check enum conformance
The enum correctly conforms to the Error protocol with valid cases.Step 2: Analyze function call
The function is called withtrybut outside ado-catchblock or withouttry?ortry!, causing a compile-time error.Final Answer:
Missing do-catch block to handle the thrown error -> Option BQuick Check:
Throwing function call needs do-catch or try? [OK]
- Calling throwing function without do-catch
- Assuming enum conformance is missing
- Misunderstanding error handling syntax
DatabaseError that conforms to Error and includes cases for connectionFailed, queryFailed, and timeout. Additionally, you want to add a computed property message that returns a user-friendly description for each case. Which of the following is the correct implementation?Solution
Step 1: Confirm enum conforms to Error and defines cases
enum DatabaseError: Error { case connectionFailed case queryFailed case timeout var message: String { switch self { case .connectionFailed: return "Connection failed" case .queryFailed: return "Query failed" case .timeout: return "Operation timed out" } } } correctly declares an enum conforming to Error with the required cases.Step 2: Check computed property implementation
The computed propertymessageuses a switch onselfto return descriptive strings for each case.Final Answer:
enum with computed property and switch -> Option CQuick Check:
Enum + Error + computed property with switch = enum DatabaseError: Error { case connectionFailed case queryFailed case timeout var message: String { switch self { case .connectionFailed: return "Connection failed" case .queryFailed: return "Query failed" case .timeout: return "Operation timed out" } } } [OK]
- Not conforming enum to Error
- Using struct instead of enum for error cases
- Ignoring switch on self in computed property
Ready to prove it?
Pass the test and this pattern moves unknown
