thiserror
ΠΡΠ΅ΠΉΡ thiserror
ΠΌΡΡΡΠΈΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΈ, ΡΠΊΡ Π΄ΠΎΠΏΠΎΠΌΠ°Π³Π°ΡΡΡ ΡΠ½ΠΈΠΊΠ½ΡΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΠ²Π°Π½Ρ ΠΏΡΠΈ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Π½Ρ ΡΠΈΠΏΡΠ² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ. ΠΡΠ½ ΠΌΡΡΡΠΈΡΡ ΠΏΠΎΡ
ΡΠ΄Π½Ρ ΠΌΠ°ΠΊΡΠΎΡΠΈ, ΡΠΊΡ Π΄ΠΎΠΏΠΎΠΌΠ°Π³Π°ΡΡΡ ΡΠ΅Π°Π»ΡΠ·ΡΠ²Π°ΡΠΈ From<T>
, Display
ΡΠ° ΡΡΠ΅ΠΉΡError
.
use std::io::Read; use std::{fs, io}; use thiserror::Error; #[derive(Debug, Error)] enum ReadUsernameError { #[error("I/O ΠΏΠΎΠΌΠΈΠ»ΠΊΠ°: {e}")] IoError(#[from] io::Error), #[error("ΠΠ΅ Π·Π½Π°ΠΉΠ΄Π΅Π½ΠΎ ΡΠΌΠ΅Π½Ρ ΠΊΠΎΡΠΈΡΡΡΠ²Π°ΡΠ° Π² {0}")] EmptyUsername(String), } fn read_username(path: &str) -> Result<String, ReadUsernameError> { let mut username = String::with_capacity(100); fs::File::open(path)?.read_to_string(&mut username)?; if username.is_empty() { return Err(ReadUsernameError::EmptyUsername(String::from(path))); } 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.
- ΠΠΎΡ
ΡΠ΄Π½ΠΈΠΉ ΠΌΠ°ΠΊΡΠΎΡ
Error
Π½Π°Π΄Π°ΡΡΡΡΡthiserror
Ρ ΠΌΠ°Ρ Π±Π°Π³Π°ΡΠΎ ΠΊΠΎΡΠΈΡΠ½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΡΠ² Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ Π²ΠΈΠ·Π½Π°ΡΠ΅Π½Π½Ρ ΡΠΈΠΏΡΠ² ΠΏΠΎΠΌΠΈΠ»ΠΎΠΊ. - ΠΠΎΠ²ΡΠ΄ΠΎΠΌΠ»Π΅Π½Π½Ρ Π·
#[error]
Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ Π΄Π»Ρ ΠΎΡΡΠΈΠΌΠ°Π½Π½Ρ ΡΡΠ΅ΠΉΡΡDisplay
. - ΠΠ°ΡΠ²Π°ΠΆΡΠ΅, ΡΠΎ ΠΏΠΎΡ
ΡΠ΄Π½ΠΈΠΉ ΠΌΠ°ΠΊΡΠΎΡ (
thiserror::
)Error
, Ρ ΠΎΡΠ° Ρ ΠΌΠ°Ρ Π΅ΡΠ΅ΠΊΡ ΡΠ΅Π°Π»ΡΠ·Π°ΡΡΡ ΡΡΠ΅ΠΉΡΡ (std::error::
)Error
, Π½Π΅ Ρ ΡΠΈΠΌ ΡΠ°ΠΌΠΈΠΌ; ΡΡΠ΅ΠΉΡΠΈ ΡΠ° ΠΌΠ°ΠΊΡΠΎΡΠΈ Π½Π΅ ΠΌΠ°ΡΡΡ ΡΠΏΡΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎΡΡ ΡΠΌΠ΅Π½.