Bird
Raised Fist0
Swiftprogramming~10 mins

Throwing functions with throws in Swift - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Throwing functions with throws
Define function with 'throws'
↓
Call function with 'try'
↓
Function runs
↓
No error
↓
Return value
↓
Continue
A function marked with 'throws' can produce an error. When calling it, use 'try' and handle errors with 'do-catch'.
Execution Sample
Swift
enum MyError: Error {
    case badInput
}

func checkNumber(_ num: Int) throws -> String {
    if num < 0 { throw MyError.badInput }
    return "Number is \(num)"
}
This function throws an error if the number is negative, otherwise returns a message.
Execution Table
StepActionInputConditionResultError ThrownOutput
1Call checkNumber with 555 < 0?FalseNo"Number is 5"
2Return from functionNo"Number is 5"
3Call checkNumber with -3-3-3 < 0?TrueYes: MyError.badInput
4Catch error in do-catchYes"Caught error: badInput"
5End
💡 Execution stops after handling error or returning value.
Variable Tracker
VariableStartAfter Step 1After Step 3Final
num-5-3-3
errorThrownNoNoYesYes
output-"Number is 5""Caught error: badInput"
Key Moments - 3 Insights
Why do we need to use 'try' when calling a throwing function?
Because the function can throw an error, 'try' tells Swift to handle that possibility, as shown in execution_table step 1 and 3.
What happens if the function throws an error?
The error is passed to the 'catch' block in the 'do-catch' structure, as seen in execution_table step 4.
Can the function return a value if it throws an error?
No, if an error is thrown, the function stops and does not return a value, shown in step 3 where output is empty.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the output after calling checkNumber with 5?
A"Number is 5"
B"Caught error: badInput"
CNo output
DMyError.badInput
💡 Hint
Check row 1 and 2 in execution_table for output when input is 5.
At which step does the function throw an error?
AStep 4
BStep 1
CStep 3
DStep 2
💡 Hint
Look at the 'Error Thrown' column in execution_table.
If we remove 'try' when calling the throwing function, what happens?
AThe code compiles and runs normally
BCompilation error because 'try' is required
CThe function never throws an error
DThe error is automatically caught
💡 Hint
Swift requires 'try' to call throwing functions, as shown in concept_flow.
Concept Snapshot
Throwing functions use 'throws' to signal errors.
Call them with 'try' inside 'do-catch' blocks.
If error occurs, control jumps to 'catch'.
If no error, function returns normally.
Always handle errors to avoid crashes.
Full Transcript
In Swift, functions that can produce errors are marked with 'throws'. When you call these functions, you must use 'try' to acknowledge the possibility of an error. The call is usually inside a 'do-catch' block to handle errors gracefully. If the function runs without error, it returns a value. If it throws an error, the catch block runs. This prevents the program from crashing and lets you respond to problems. The execution table shows calling the function with a positive number returns a message, while calling it with a negative number throws an error that is caught and handled.

Practice

(1/5)
1. What does the throws keyword indicate when used in a Swift function declaration?
easy
A. The function cannot be called outside its module.
B. The function always returns a Boolean value.
C. The function can produce an error that must be handled.
D. The function runs asynchronously.

Solution

  1. Step 1: Understand the role of throws

    The throws keyword marks a function that can produce an error during execution.
  2. Step 2: Recognize error handling requirement

    Calling a throws function requires handling the possible error with try and do-catch.
  3. Final Answer:

    The function can produce an error that must be handled. -> Option C
  4. Quick Check:

    throws means function can throw error [OK]
Hint: Throws means function can fail and needs error handling [OK]
Common Mistakes:
  • Thinking throws means async function
  • Assuming throws means function returns Bool
  • Confusing throws with access control keywords
2. Which of the following is the correct way to declare a throwing function in Swift?
easy
A. func fetchData() -> throws String
B. func fetchData() throw -> String
C. func fetchData() throws String
D. func fetchData() throws -> String

Solution

  1. Step 1: Recall correct syntax for throwing functions

    In Swift, throws comes after the parentheses and before the return type.
  2. Step 2: Match syntax with options

    func fetchData() throws -> String matches the correct syntax: func name() throws -> ReturnType.
  3. Final Answer:

    func fetchData() throws -> String -> Option D
  4. Quick Check:

    Correct syntax is throws after () [OK]
Hint: Put throws right after () before return type [OK]
Common Mistakes:
  • Writing throw instead of throws
  • Placing throws after return type
  • Omitting throws keyword
3. What will be the output of the following Swift code?
enum FileError: Error {
    case notFound
}

func readFile() throws -> String {
    throw FileError.notFound
}

do {
    let content = try readFile()
    print(content)
} catch {
    print("Error occurred")
}
medium
A. Compilation error
B. Error occurred
C. No output
D. notFound

Solution

  1. Step 1: Analyze the throwing function behavior

    The function readFile() always throws FileError.notFound error.
  2. Step 2: Understand the do-catch block

    The try calls readFile(), which throws, so control moves to catch block printing "Error occurred".
  3. Final Answer:

    Error occurred -> Option B
  4. Quick Check:

    Thrown error triggers catch printing message [OK]
Hint: Thrown error triggers catch block output [OK]
Common Mistakes:
  • Expecting thrown error value to print
  • Ignoring that error causes catch block
  • Thinking no output occurs
4. Identify the error in this Swift code snippet:
func riskyOperation() throws -> Int {
    return 42
}

let result = riskyOperation()
print(result)
medium
A. Missing try keyword when calling riskyOperation()
B. Function should not return Int
C. Throws keyword is not allowed here
D. Missing catch block after function call

Solution

  1. Step 1: Check calling syntax for throwing functions

    Calling a function marked with throws requires using try keyword.
  2. Step 2: Identify missing try keyword

    The code calls riskyOperation() without try, causing a compile error.
  3. Final Answer:

    Missing try keyword when calling riskyOperation() -> Option A
  4. Quick Check:

    Throwing functions need try when called [OK]
Hint: Use try when calling throws functions [OK]
Common Mistakes:
  • Calling throws function without try
  • Assuming throws means no return value
  • Forgetting to handle errors with do-catch
5. You want to write a function parseNumber(from: String) that throws an error if the string is not a valid integer. Which of the following implementations correctly uses throws and error handling?
hard
A. enum ParseError: Error { case invalidFormat } func parseNumber(from text: String) throws -> Int { guard let number = Int(text) else { throw ParseError.invalidFormat } return number }
B. func parseNumber(from text: String) -> Int { if Int(text) == nil { print("Invalid format") } return Int(text) ?? 0 }
C. enum ParseError: Error { case invalidFormat } func parseNumber(from text: String) -> Int throws { if Int(text) == nil { throw ParseError.invalidFormat } return Int(text)! }
D. func parseNumber(from text: String) throws -> Int { if Int(text) == nil { return 0 } return Int(text)! }

Solution

  1. Step 1: Check function signature and error throwing

    enum ParseError: Error { case invalidFormat } func parseNumber(from text: String) throws -> Int { guard let number = Int(text) else { throw ParseError.invalidFormat } return number } correctly declares throws after parameters and before return type, and throws error if parsing fails.
  2. Step 2: Verify error throwing logic

    enum ParseError: Error { case invalidFormat } func parseNumber(from text: String) throws -> Int { guard let number = Int(text) else { throw ParseError.invalidFormat } return number } uses guard let to safely unwrap Int, throwing ParseError.invalidFormat if conversion fails.
  3. Final Answer:

    Correctly implements throwing function with error handling. -> Option A
  4. Quick Check:

    Throws declared and error thrown on invalid input [OK]
Hint: Use guard and throw error inside throws function [OK]
Common Mistakes:
  • Not marking function with throws
  • Throwing error outside throws function
  • Returning default instead of throwing error
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard