thiserror و anyhow
این thiserror و anyhow crateها به طور گسترده ای برای ساده کردن رسیدگی به خطا استفاده میشوند.
thiserroris often used in libraries to create custom error types that implementFrom<T>.- اغلب
anyhowتوسط برنامهها برای کمک به مدیریت خطا در توابع، از جمله افزودن اطلاعات متنی به خطاهای شما، استفاده میشود.
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!("Error: {err:?}"), } }
This slide should take about 5 minutes.
thiserror
- ماکرو استخراج
Errorتوسطthiserrorارائه میشود و دارای ویژگیهای مفید زیادی برای کمک به تعریف انواع خطا به روشی فشرده است. - ویژگی
std::error::Errorبه طور خودکار مشتق میشود. - پیام
#[error]برای استخراج ویژگیDisplayاستفاده میشود.
anyhow
anyhow::Errorاساساً پوششی (wrapper) در اطرافBox<dyn Error>است. به این ترتیب معمولاً انتخاب خوبی برای API عمومی یک کتابخانه نیست، اما به طور گسترده در برنامههای مختلف استفاده میشود.anyhow::Result<V>یک type مستعار برای استResult<V, anyhow::Error>.- در صورت لزوم میتوان نوع خطای واقعی داخل آن را برای بررسی استخراج کرد.
- عملکرد ارائه شده توسط
anyhow::Result<T>ممکن است برای توسعهدهندگان Go آشنا باشد، زیرا الگوهای استفاده و ارگونومی مشابهی را با(T, error)از Go ارائه میدهد. anyhow::Contextیک ویژگی است که برای typeهای استانداردResultوOptionپیادهسازی شده است.use anyhow::Contextبرای فعال کردن.context()و.with_context()در آن typeها ضروری است.