Bird
Raised Fist0
Rustprogramming~10 mins

Error handling best practices in Rust - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to return a Result type from the function.

Rust
fn divide(a: f64, b: f64) -> [1] {
    if b == 0.0 {
        Err("Cannot divide by zero")
    } else {
        Ok(a / b)
    }
}
Drag options to blanks, or click blank then click option'
AResult<f64, &str>
BOption<f64>
Cf64
Dbool
Attempts:
3 left
💡 Hint
Common Mistakes
Using Option instead of Result when you want to provide error details.
Returning just f64 without error handling.
2fill in blank
medium

Complete the code to propagate errors using the ? operator.

Rust
fn read_number_from_file() -> Result<i32, std::io::Error> {
    let content = std::fs::read_to_string("number.txt")[1];
    let num: i32 = content.trim().parse().unwrap();
    Ok(num)
}
Drag options to blanks, or click blank then click option'
A.unwrap()
B.ok()
C?
D.expect("error")
Attempts:
3 left
💡 Hint
Common Mistakes
Using .unwrap() which panics on error instead of propagating it.
Using .ok() which converts to Option and loses error info.
3fill in blank
hard

Fix the error in the match expression to handle both Ok and Err variants.

Rust
match result [1]{
    Ok(value) => println!("Value: {}", value),
    Err(e) => println!("Error: {}", e),
}
Drag options to blanks, or click blank then click option'
Awith
Bin
C=>
D{
Attempts:
3 left
💡 Hint
Common Mistakes
Using '=>' after match instead of braces.
Using 'in' or 'with' which are invalid here.
4fill in blank
hard

Fill in the blank to create a custom error type implementing the Error trait.

Rust
#[derive(Debug)]
struct MyError;

impl std::fmt::Display for MyError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "An error occurred")
    }
}

impl std::error::[1] for MyError {{}}

fn do_something() -> Result<(), MyError> {
    Err(MyError)
}
Drag options to blanks, or click blank then click option'
AError
BClone
CDebug
DCopy
Attempts:
3 left
💡 Hint
Common Mistakes
Implementing the wrong trait like Clone or Copy.
Forgetting to return Err variant.
5fill in blank
hard

Fill all three blanks to use a Result with map_err to convert error types.

Rust
fn parse_number(s: &str) -> Result<i32, String> {
    s.parse::<i32>()
        .map_err(|[1]| [2]::from(format!("Parse error: {}", [3])))
}
Drag options to blanks, or click blank then click option'
Ae
BString
Dstd::io::Error
Attempts:
3 left
💡 Hint
Common Mistakes
Using the wrong variable name in the closure.
Using an unrelated error type like std::io::Error.

Practice

(1/5)
1. What is the primary purpose of using Result in Rust error handling?
easy
A. To convert a string into a number
B. To represent either success or failure of an operation
C. To define a constant value in the program
D. To create a new thread for parallel execution

Solution

  1. Step 1: Understand the role of Result

    Result is an enum used to represent either success (Ok) or failure (Err) in Rust operations.
  2. Step 2: Identify the purpose in error handling

    It helps safely handle errors by forcing the programmer to consider both success and failure cases explicitly.
  3. Final Answer:

    To represent either success or failure of an operation -> Option B
  4. Quick Check:

    Result = success or failure [OK]
Hint: Result means success or error outcome [OK]
Common Mistakes:
  • Confusing Result with threading or constants
  • Thinking Result automatically fixes errors
  • Using Result only for numbers or strings
2. Which of the following is the correct syntax to use the ? operator in a function that returns Result<T, E>?
easy
A. let value = some_function()?;
B. let value = some_function!();
C. let value = some_function();?
D. let value = ?some_function();

Solution

  1. Step 1: Recall the ? operator usage

    The ? operator is placed immediately after a function call that returns a Result to propagate errors easily.
  2. Step 2: Check syntax correctness

    let value = some_function()?; correctly places ? after the function call: some_function()?. Other options misuse the operator placement.
  3. Final Answer:

    let value = some_function()?; -> Option A
  4. Quick Check:

    ? goes right after function call [OK]
Hint: Put ? right after the function call [OK]
Common Mistakes:
  • Placing ? before the function call
  • Using ! instead of ?
  • Adding ? after semicolon
3. What will be the output of this Rust code snippet?
fn divide(a: i32, b: i32) -> Result {
    if b == 0 {
        Err(String::from("division by zero"))
    } else {
        Ok(a / b)
    }
}

fn main() {
    match divide(10, 0) {
        Ok(result) => println!("Result: {}", result),
        Err(e) => println!("Error: {}", e),
    }
}
medium
A. Result: 0
B. Panic at runtime
C. Error: division by zero
D. No output

Solution

  1. Step 1: Analyze the divide function call

    The function is called with b = 0, triggering the error branch returning Err("division by zero").
  2. Step 2: Check the match handling in main

    The Err case prints "Error: division by zero" to the console.
  3. Final Answer:

    Error: division by zero -> Option C
  4. Quick Check:

    Error message prints on zero divisor [OK]
Hint: Check if divisor is zero to get error output [OK]
Common Mistakes:
  • Assuming division returns 0 instead of error
  • Expecting panic instead of handled error
  • Ignoring match arms
4. Identify the error in this Rust code snippet related to error handling:
fn read_file() -> Result {
    let content = std::fs::read_to_string("file.txt");
    Ok(content)
}
medium
A. File path should be a variable, not a string literal
B. Function should return String not Result
C. Using Ok instead of Err
D. Missing ? operator to propagate error

Solution

  1. Step 1: Understand the return type and function call

    The function returns Result<String, std::io::Error>, but read_to_string returns a Result itself.
  2. Step 2: Identify missing error propagation

    The code assigns content as a Result but wraps it again in Ok without handling errors. The ? operator is needed to propagate errors properly.
  3. Final Answer:

    Missing ? operator to propagate error -> Option D
  4. Quick Check:

    Use ? to handle Result errors [OK]
Hint: Use ? to unwrap or propagate Result errors [OK]
Common Mistakes:
  • Wrapping Result inside Ok again
  • Ignoring error propagation
  • Changing return type incorrectly
5. You want to write a function that reads two files and returns the combined content as a String. Which is the best way to handle errors using Result and the ? operator? Choose the correct implementation:
fn read_two_files() -> Result {
    // Option A
    let content1 = std::fs::read_to_string("file1.txt")?;
    let content2 = std::fs::read_to_string("file2.txt")?;
    Ok(content1 + &content2)

    // Option B
    let content1 = std::fs::read_to_string("file1.txt").unwrap();
    let content2 = std::fs::read_to_string("file2.txt").unwrap();
    Ok(content1 + &content2)

    // Option C
    let content1 = std::fs::read_to_string("file1.txt").expect("file1 missing");
    let content2 = std::fs::read_to_string("file2.txt").expect("file2 missing");
    Ok(content1 + &content2)

    // Option D
    let content1 = std::fs::read_to_string("file1.txt");
    let content2 = std::fs::read_to_string("file2.txt");
    Ok(content1.unwrap() + &content2.unwrap())
}
hard
A. Use ? operator to propagate errors cleanly
B. Use unwrap() which panics on error
C. Use expect() which panics with message
D. Call unwrap() on Result without error handling

Solution

  1. Step 1: Understand error propagation best practice

    Using the ? operator propagates errors to the caller without panicking, making the function safe and clear.
  2. Step 2: Compare with other options

    The other options use unwrap() or expect(), which cause the program to panic on error, not recommended for robust error handling.
  3. Final Answer:

    Use ? operator to propagate errors cleanly -> Option A
  4. Quick Check:

    ? propagates errors safely [OK]
Hint: Use ? to avoid panics and propagate errors [OK]
Common Mistakes:
  • Using unwrap or expect causing panics
  • Not propagating errors properly
  • Ignoring error handling for multiple calls
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