ЛЕКЦІЯ 16

Обработка ошибок: Result<T, E> и Option<T>

Рецензія: Struct и Enum

План

  • Option для можливих значень
  • Result для помилок
  • Обработка з match та unwrap

Option<T>

Option<T>

Enum з двома варіантами: Some(T) або None. Замість null на C/Java.

Option використання

let x = Some(5);
let y: Option = None;

match x {
  Some(n) => println!("Value: {}", n),
  None => println!("No value"),
}

// unwrap() - небезпечно!
let val = x.unwrap();  // паніка якщо None!

Result<T, E>

Result<T, E>

Enum для Ok(T) або Err(E).標準для функцій, які можуть помилитися.

Result визначення та використання

fn parse_int(s: &str) -> Result {
  match s.parse() {
    Ok(n) => Ok(n),
    Err(_) => Err(String::from("Failed to parse")),
  }
}

let result = parse_int("42");
match result {
  Ok(n) => println!("Parsed: {}", n),
  Err(e) => println!("Error: {}", e),
}

Option методи

Зручні методи Option

let x = Some(5);

let doubled = x.map(|n| n * 2);  // Some(10)

let val = x.unwrap_or(0);  // 5 або 0 якщо None

if x.is_some() {
  println!("Some value");
}

Result методи

let result: Result = Ok(42);

let val = result.unwrap_or(-1);  // 42 або -1 якщо Err

let mapped = result.map(|n| n * 2);  // Ok(84)

let msg = result.unwrap_or_else(|_| String::from("Default"));

? operator (the Question Mark)

?

Скорочення для Error propagation. Повертає значення з Ok або завершує функцію з Err.

? operator для Result

fn read_file(path: &str) -> Result> {
  let mut file = std::fs::File::open(path)?;  // Err закінчує функцію
  let mut contents = String::new();
  std::io::Read::read_to_string(&mut file, &mut contents)?;
  Ok(contents)
}

Запитання 1

Як перевірити наявність значення в Option без unwrap?

  • is_some() та match
  • Тільки unwrap()
  • if None
✅ Правильна відповідь: is_some() та match

Запитання 2

Що робить ? operator?

  • Ділить число
  • Пропагує помилки в Result
  • Позначає вибір
✅ Правильна відповідь: Пропагує помилки в Result

Помилка: Завжди unwrap()

⚠️ ЗАСТЕРЕЖЕННЯ

❌ Неправильно

✓ Правильно

Підсумки

  • Option: Some або None замість null
  • Result: Ok або Err для помилок
  • match для безпечної обработки
  • ? operator для error propagation

Далі

Наступна лекція:

Лекція 17: Колекции Vec, String, HashMap

Дякую за увагу! 💾

← Повернутися до списку лекцій