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, Π½Π΅ Ρ ΡΠΈΠΌ ΡΠ°ΠΌΠΈΠΌ; ΡΡΠ΅ΠΉΡΠΈ ΡΠ° ΠΌΠ°ΠΊΡΠΎΡΠΈ Π½Π΅ ΠΌΠ°ΡΡΡ ΡΠΏΡΠ»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΠΎΡΡ ΡΠΌΠ΅Π½.