📖 Scenario: Imagine you are building a simple app that checks user input and reports errors clearly.
🎯 Goal: You will create a custom error type by conforming to the Error protocol, then use it to handle errors in a function.
📋 What You'll Learn
Create an enum called InputError that conforms to the Error protocol
Add two cases to InputError: empty and tooShort
Write a function validateInput(_ input: String) throws that throws InputError.empty if the input is empty
Throw InputError.tooShort if the input length is less than 5 characters
Use a do-catch block to call validateInput and print appropriate messages for each error
💡 Why This Matters
🌍 Real World
Custom error types help apps give clear feedback when something goes wrong, like invalid user input.
💼 Career
Understanding error handling is essential for writing safe and user-friendly Swift applications.
Progress0 / 4 steps
1
Create the InputError enum conforming to Error
Create an enum called InputError that conforms to the Error protocol. Add two cases: empty and tooShort.
Swift
Hint
Use enum InputError: Error to start. Add case empty and case tooShort inside.
2
Write the validateInput function that throws errors
Write a function called validateInput(_ input: String) throws. Inside, throw InputError.empty if input is empty. Throw InputError.tooShort if input.count is less than 5.
Swift
Hint
Use if input.isEmpty to check empty. Use throw InputError.empty inside. Then check input.count < 5 and throw InputError.tooShort.
3
Use do-catch to handle errors from validateInput
Write a do-catch block that calls try validateInput(input) with input set to "Hi". Catch InputError.empty and print "Input is empty". Catch InputError.tooShort and print "Input is too short". Catch any other errors and print "Unknown error".
Swift
Hint
Use do { try validateInput(input) } and multiple catch blocks for each error case. Print messages inside each catch.
4
Print the final output
Run the program and print the output from the do-catch block.
Swift
Hint
The output should be Input is too short because "Hi" has less than 5 characters.
Practice
(1/5)
1. What is the main purpose of the Error protocol in Swift?
easy
A. To create network connections
B. To handle user interface events
C. To manage memory allocation automatically
D. To define custom error types that can be thrown and caught
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 D
Quick Check:
Error protocol = custom error types [OK]
Hint: Error protocol is for creating your own error types [OK]
Common Mistakes:
Confusing Error protocol with UI or memory management
Hint: Add ': Error' after enum name to conform [OK]
Common Mistakes:
Omitting ': Error' conformance
Using raw value types without conforming to Error
Confusing enum raw types with protocol conformance
3. What will be the output of the following Swift code?
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")
}
medium
A. File not found error caught
B. File content
C. Other error
D. No output
Solution
Step 1: Analyze the function behavior
The function throws FileError.notFound when the filename is "missing.txt".
Step 2: Check the do-catch block
The catch block specifically catches FileError.notFound and prints "File not found error caught".
Final Answer:
File not found error caught -> Option A
Quick Check:
Throw and catch specific error = prints catch message [OK]
Hint: Throws matching catch block runs, prints its message [OK]
Common Mistakes:
Expecting function to return normally
Ignoring specific catch and expecting generic catch
Confusing error thrown with error caught
4. Identify the error in the following Swift code snippet:
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")
medium
A. Function login should not throw errors
B. Missing do-catch block to handle the thrown error
C. Enum does not conform to Error protocol
D. Invalid enum case names
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 with try but outside a do-catch block or without try? or try!, causing a compile-time error.
Final Answer:
Missing do-catch block to handle the thrown error -> Option B
Quick Check:
Throwing function call needs do-catch or try? [OK]
Hint: Use do-catch when calling throwing functions [OK]
Common Mistakes:
Calling throwing function without do-catch
Assuming enum conformance is missing
Misunderstanding error handling syntax
5. You want to create a custom error enum 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?
hard
A. struct DatabaseError: Error {
var message: String
}
B. enum DatabaseError {
case connectionFailed
case queryFailed
case timeout
var message: String {
return "Error occurred"
}
}
C. 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"
}
}
}
D. enum DatabaseError: Error {
case connectionFailed(String)
case queryFailed(String)
case timeout(String)
var message: String {
return "Error"
}
}
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 property message uses a switch on self to return descriptive strings for each case.
Final Answer:
enum with computed property and switch -> Option C
Quick 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]
Hint: Use enum with switch in computed property for messages [OK]
Common Mistakes:
Not conforming enum to Error
Using struct instead of enum for error cases
Ignoring switch on self in computed property
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.