anyhow
ΠΡΠ΅ΠΉΡ anyhow
Π½Π°Π΄Π°Ρ Π±Π°Π³Π°ΡΠΈΠΉ ΡΠΈΠΏ ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ Π· ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΠΎΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π΄ΠΎΠ΄Π°ΡΠΊΠΎΠ²ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ½ΠΎΡ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ, ΡΠΊΠ° ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π° Π΄Π»Ρ ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ΄ΡΡΠ΅ΠΆΠ΅Π½Π½Ρ Π΄ΡΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΡΠΎ ΠΏΡΠΈΠ·Π²Π΅Π»ΠΈ Π΄ΠΎ Π²ΠΈΠ½ΠΈΠΊΠ½Π΅Π½Π½Ρ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ.
Π¦Π΅ ΠΌΠΎΠΆΠ½Π° ΠΏΠΎΡΠ΄Π½Π°ΡΠΈ Π·Ρ Π·ΡΡΡΠ½ΠΈΠΌΠΈ ΠΌΠ°ΠΊΡΠΎΡΠ°ΠΌΠΈ Π· thiserror
, ΡΠΎΠ± ΡΠ½ΠΈΠΊΠ½ΡΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½Π½Ρ ΡΠ΅Π°Π»ΡΠ·Π°ΡΡΠΉ ΡΡΠ΅ΠΉΡΡΠ² ΡΠ²Π½ΠΎ Π΄Π»Ρ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΡΠΊΠΈΡ
ΡΠΈΠΏΡΠ² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ.
use anyhow::{bail, Context, Result}; use std::fs; use std::io::Read; use thiserror::Error; #[derive(Clone, Debug, Eq, Error, PartialEq)] #[error("ΠΠ΅ Π·Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΡΠΌΠ΅Π½Ρ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΠ° Π² {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!("ΠΠ΅ Π²Π΄Π°Π»ΠΎΡΡ Π²ΡΠ΄ΠΊΡΠΈΡΠΈ {path}"))? .read_to_string(&mut username) .context("ΠΠ΅ Π²Π΄Π°Π»ΠΎΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΠΈ")?; 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}"), Err(err) => println!("ΠΠΎΠΌΠΈΠ»ΠΊΠ°: {err:?}"), } }
This slide should take about 5 minutes.
anyhow::Error
ΠΏΠΎ ΡΡΡΡ Ρ ΠΎΠ±Π³ΠΎΡΡΠΊΠΎΡ Π½Π°Π²ΠΊΠΎΠ»ΠΎBox<dyn Error>
. Π’Π°ΠΊΠΈΠΌ ΡΠΈΠ½ΠΎΠΌ, ΡΠ΅ Π·Π½ΠΎΠ²Ρ ΠΆ ΡΠ°ΠΊΠΈ, ΡΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π΅ Ρ Ρ ΠΎΡΠΎΡΠΈΠΌ Π²ΠΈΠ±ΠΎΡΠΎΠΌ Π΄Π»Ρ Π·Π°Π³Π°Π»ΡΠ½ΠΎΠ΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ API Π±ΡΠ±Π»ΡΠΎΡΠ΅ΠΊΠΈ, Π°Π»Π΅ ΡΠΈΡΠΎΠΊΠΎ Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°Ρ .anyhow::Result<V>
β ΡΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠ½ΡΠΌ ΡΠΈΠΏΡ Π΄Π»ΡResult<V, anyhow::Error>
.- Π€ΡΠ½ΠΊΡΡΠΎΠ½Π°Π»ΡΠ½ΡΡΡΡ, ΡΠΊΡ Π½Π°Π΄Π°Ρ
anyhow::Error
, ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π·Π½Π°ΠΉΠΎΠΌΠ° ΡΠΎΠ·ΡΠΎΠ±Π½ΠΈΠΊΠ°ΠΌ Go, ΠΎΡΠΊΡΠ»ΡΠΊΠΈ Π²ΠΎΠ½Π° Π·Π°Π±Π΅Π·ΠΏΠ΅ΡΡΡ ΠΏΠΎΠ²Π΅Π΄ΡΠ½ΠΊΡ, ΠΏΠΎΠ΄ΡΠ±Π½Ρ Π΄ΠΎ ΡΠΈΠΏΡ Goerror
, Π°Result<T, anyhow::Error>
Π΄ΡΠΆΠ΅ ΡΡ ΠΎΠΆΠ° Π½Π° Go(T, error)
(Π· ΡΠΌΠΎΠ²ΠΎΡ, ΡΠΎ ΡΡΠ»ΡΠΊΠΈ ΠΎΠ΄ΠΈΠ½ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΏΠ°ΡΠΈ Ρ Π·Π½Π°ΡΡΡΠΈΠΌ). anyhow::Context
- ΡΠ΅ ΡΡΠ΅ΠΉΡ, ΡΠ΅Π°Π»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΉ Π΄Π»Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΡΠΈΠΏΡΠ²Result
ΡΠ°Option
. ΠΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρanyhow::Context
Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½Π΅ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΠΎΠ± Π΄ΠΎΠ·Π²ΠΎΠ»ΠΈΡΠΈ Π²ΠΈΠΊΠΎΡΠΈΡΡΠ°Π½Π½Ρ.context()
ΡΠ°.with_context()
Π΄Π»Ρ ΡΠΈΡ ΡΠΈΠΏΡΠ².
ΠΡΠ»ΡΡΠ΅ ΡΠ½ΡΠΎΡΠΌΠ°ΡΡΡ Π΄Π»Ρ Π²ΠΈΠ²ΡΠ΅Π½Π½Ρ
anyhow::Error
ΠΌΠ°Ρ ΠΏΡΠ΄ΡΡΠΈΠΌΠΊΡ Π΄Π°ΡΠ½ΠΊΠ°ΡΡΠΈΠ½Π³Ρ, ΠΏΠΎΠ΄ΡΠ±Π½ΠΎ Π΄ΠΎstd::any::Any
; ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΠΉ ΡΠΈΠΏ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ, ΡΠΎ Π·Π±Π΅ΡΡΠ³Π°ΡΡΡΡΡ Π²ΡΠ΅ΡΠ΅Π΄ΠΈΠ½Ρ, ΠΌΠΎΠΆΠ΅ Π±ΡΡΠΈ Π²ΠΈΡΡΠ³Π½ΡΡΠΈΠΉ Π΄Π»Ρ Π²ΠΈΠ²ΡΠ΅Π½Π½Ρ Π·Π° Π΄ΠΎΠΏΠΎΠΌΠΎΠ³ΠΎΡError::downcast
.