Keyboard shortcuts

Press ← or β†’ to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

anyhow

ΠšΡ€Π΅ΠΉΡ‚ anyhow прСдоставляСт Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ Ρ‚ΠΈΠΏ ошибки с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ контСкстной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для создания сСмантичСской трассировки Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄Π΅Π»Π°Π»Π° ΠΏΠ΅Ρ€Π΅Π΄ ошибкой.

Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ‡Π΅Ρ‚Π°Ρ‚ΡŒ с ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ макросами ΠΈΠ· thiserror, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π΅ΠΉΡ‚ΠΎΠ² Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ для собствСнных Ρ‚ΠΈΠΏΠΎΠ² ошибок.

// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use anyhow::{Context, Result, bail};
use std::fs;
use std::io::Read;
use thiserror::Error;

#[derive(Clone, Debug, Eq, Error, PartialEq)]
#[error("Found no username in {0}")]
struct EmptyUsernameError(String);

fn read_username(path: &str) -> Result<String> {
    let mut username = String::with_capacity(100);
    fs::File::open(path)
        .with_context(|| format!("Failed to open {path}"))?
        .read_to_string(&mut username)
        .context("Failed to read")?;
    if username.is_empty() {
        bail!(EmptyUsernameError(path.to_string()));
    }
    Ok(username)
}

fn main() {
    //fs::write("config.dat", "").unwrap();
    match read_username("config.dat") {
        Ok(username) => println!("Username: {username}"),
        Err(err) => println!("Error: {err}"),
    }
}
This slide should take about 5 minutes.
  • anyhow::Error ΠΏΠΎ сути являСтся ΠΎΠ±Ρ‘Ρ€Ρ‚ΠΊΠΎΠΉ Π²ΠΎΠΊΡ€ΡƒΠ³ Box<dyn Error>. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ снова ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Π»ΡƒΡ‡ΡˆΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€ для ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ API Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² прилоТСниях.
  • anyhow::Result<V> β€” псСвдоним Ρ‚ΠΈΠΏΠ° для Result<V, anyhow::Error>.
  • Π€ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ прСдоставляСт anyhow::Error, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°ΠΊΠΎΠΌΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Π½Π° Go: ΠΎΠ½Π° Π²Π΅Π΄Ρ‘Ρ‚ сСбя ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° Ρ‚ΠΈΠΏ error Π² Go, Π° Result<T, anyhow::Error> ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° (T, error) Π² Go (ΠΏΠΎ соглашСнию Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΌ являСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт ΠΏΠ°Ρ€Ρ‹).
  • anyhow::Context β€” Ρ‚Ρ€Π΅ΠΉΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ для стандартных Ρ‚ΠΈΠΏΠΎΠ² Result ΠΈ Option. Π§Ρ‚ΠΎΠ±Ρ‹ стали доступны .context() ΠΈ .with_context() для этих Ρ‚ΠΈΠΏΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ use anyhow::Context.

Для дальнСйшСго изучСния

  • anyhow::Error ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ (downcast), ΠΊΠ°ΠΊ std::any::Any: ΠΏΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ ошибки, хранящийся Π²Π½ΡƒΡ‚Ρ€ΠΈ, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Error::downcast.