Bird
Raised Fist0
Swiftprogramming~5 mins

Throwing functions with throws in Swift

Choose your learning style10 modes available
Introduction

Sometimes a function might fail to do its job. Using throws lets the function tell you when something goes wrong.

When reading a file that might not exist.
When converting a string to a number that might be invalid.
When making a network request that could fail.
When checking user input that might be incorrect.
Syntax
Swift
func functionName() throws -> ReturnType {
    // code that might throw an error
}

Use throws after the function parentheses to mark it as a throwing function.

Calling a throwing function requires handling errors with try.

Examples
A simple throwing function that returns a string or throws an error.
Swift
func readFile() throws -> String {
    // might throw an error if file not found
    return "file content"
}
This function throws an error if you try to divide by zero.
Swift
enum DivisionError: Error {
    case divisionByZero
}

func divide(_ a: Int, by b: Int) throws -> Int {
    if b == 0 {
        throw DivisionError.divisionByZero
    }
    return a / b
}
Sample Program

This program defines a throwing function divide that throws an error if dividing by zero. It then calls this function twice: once with valid input and once with zero as the divisor. The errors are caught and handled with do-catch.

Swift
enum DivisionError: Error {
    case divisionByZero
}

func divide(_ a: Int, by b: Int) throws -> Int {
    if b == 0 {
        throw DivisionError.divisionByZero
    }
    return a / b
}

// Using the throwing function

func testDivision() {
    do {
        let result = try divide(10, by: 2)
        print("Result: \(result)")
    } catch DivisionError.divisionByZero {
        print("Error: Cannot divide by zero.")
    } catch {
        print("Unexpected error: \(error)")
    }

    do {
        let result = try divide(10, by: 0)
        print("Result: \(result)")
    } catch DivisionError.divisionByZero {
        print("Error: Cannot divide by zero.")
    } catch {
        print("Unexpected error: \(error)")
    }
}

testDivision()
OutputSuccess
Important Notes

Throwing functions must be called with try, try?, or try!.

Use do-catch blocks to handle errors gracefully.

Errors must conform to the Error protocol.

Summary

Use throws to mark functions that can fail.

Call throwing functions with try and handle errors with do-catch.

Define errors by creating types that conform to Error.

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