Bird
Raised Fist0
Rustprogramming~5 mins

Error handling best practices in Rust - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main difference between panic! and Result in Rust error handling?
panic! stops the program immediately when an unrecoverable error occurs, while Result allows the program to handle recoverable errors gracefully without stopping.
Click to reveal answer
intermediate
Why should you prefer returning Result over using panic! in library code?
Returning Result lets the user of the library decide how to handle errors, making the code more flexible and robust. panic! forces the program to stop, which is usually not desired in libraries.
Click to reveal answer
beginner
What does the ? operator do in Rust error handling?
The ? operator simplifies error propagation by returning the error immediately if it occurs, or unwrapping the successful value to continue execution.
Click to reveal answer
intermediate
What is the benefit of defining custom error types in Rust?
Custom error types help provide clear, specific error information and make it easier to handle different error cases distinctly in your code.
Click to reveal answer
beginner
When should you use unwrap() or expect() in Rust?
Use unwrap() or expect() only when you are sure an error cannot happen or when a failure means the program cannot continue safely. Otherwise, prefer proper error handling with Result.
Click to reveal answer
What does the Result type represent in Rust?
AA macro for printing errors
BA function that always panics
CA type for asynchronous operations
DA value that can be either success or error
Which Rust feature helps propagate errors without writing explicit match statements?
AThe <code>panic!</code> macro
BThe <code>unwrap()</code> method
CThe <code>? operator</code>
DThe <code>loop</code> keyword
What is a good practice when writing Rust libraries regarding error handling?
AReturn <code>Result</code> types to let users handle errors
BAlways use <code>panic!</code> for errors
CIgnore errors silently
DUse <code>unwrap()</code> everywhere
When is it appropriate to use unwrap() in Rust?
AWhen you are certain the value is not an error
BNever use <code>unwrap()</code>
CWhen you want to propagate errors
DWhen you want to handle errors gracefully
Why define custom error types in Rust?
ATo make error messages shorter
BTo provide specific error information and better handling
CTo avoid using <code>Result</code>
DTo make the code run faster
Explain the difference between panic! and returning a Result in Rust error handling.
Think about when you want the program to stop versus when you want to handle errors.
You got /3 concepts.
    Describe how the ? operator helps simplify error handling in Rust.
    It helps avoid writing many match statements.
    You got /3 concepts.

      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