Добавить объявление

Anyhow context(): добавляем контекст ошибкам в Rust

Привет! В прошлый раз мы обсуждали, почему лучше использовать expect() вместо unwrap(). Сегодня пойдем дальше и рассмотрим более элегантный способ работы с ошибками - использование Result с .context() из библиотеки anyhow.

Пример:


use anyhow::{Context, Result};

// Прежний подход: использование expect()
fn load_config_old() -> String {
let content = std::fs::read_to_string("config.txt")
.expect("Не удалось прочитать файл config.txt");
content
}

// Новый подход: использование context() с Result
fn load_config_new() -> Result {
let content = std::fs::read_to_string("config.txt")
.context("Не удалось прочитать файл config.txt")?;

Ok(content)
}

fn main() -> Result<()> {
// Прежний подход: паника при ошибке
let config_old = load_config_old();
println!("Старый конфиг загружен: {}", config_old);

// Новый подход: изящная обработка ошибки
let config_new = load_config_new()?;
println!("Новый конфиг загружен: {}", config_new);
Ok(())
}

Почему этот подход лучше:


  • Сохраняется цепочка ошибок: видна полная история возникновения проблемы.

  • Гибкая обработка: ошибку можно обработать на любом уровне приложения.

  • Ясные сообщения: сразу понятно, что именно пошло не так.

  • Никаких паник: программа продолжает работать там, где это возможно.

Простой пример с пользовательскими данными:


fn load_user_data(user_id: u32) -> Result {
let filename = format!("user_{}.json", user_id);

let data = std::fs::read_to_string(&filename)
.with_context(|| format!("Файл пользователя {} не найден", user_id))?;

Ok(data)
}

Ключевые методы anyhow:


  • .context() - добавляет статическое описание ошибки.

  • .with_context() - создает описание с динамическими данными.

  • anyhow::bail!() - для возврата собственных ошибок.

Вывод:


Переход от expect() к context() - это качественное улучшение вашего кода. Вместо простых сообщений об ошибках вы получаете полноценную систему диагностики, которая сохраняет контекст и значительно ускоряет отладку.
01.12.2025 15 201