thiserror
ชนิดข้อมูลข้อผิดพลาดแบบกำหนดเอง
thiserror เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงต้องใช้ข้อผิดพลาดแบบกำหนดเอง
ไลบรารีควรเปิดเผยชนิดข้อผิดพลาดที่สื่อความหมาย เพื่อให้ผู้เรียกตอบสนองต่อความล้มเหลวแต่ละแบบได้ การเขียนชนิดเหล่านี้ด้วยตนเองทำให้ต้องเขียนโค้ดประกอบจำนวนมาก ไลบรารี thiserror จะสร้างโค้ดเหล่านี้ให้คุณ
เพิ่ม thiserror
เพิ่มไลบรารีนี้เป็นสิ่งที่ต้องพึ่งพา ไลบรารีนี้เป็นไลบรารีมาโครสำหรับ derive และไม่มีต้นทุนขณะทำงาน
[dependencies]
thiserror = "1.0"กำหนดอีนัมข้อผิดพลาด
ใช้ derive Error กับอีนัมที่แต่ละตัวเลือกแทนความล้มเหลวคนละแบบ แอตทริบิวต์ #[error("...")] จะกำหนดข้อความสำหรับ Display
use thiserror::Error;
#[derive(Error, Debug)]
pub enum DataError {
#[error("item not found")]
NotFound,
#[error("invalid input: {0}")]
Invalid(String),
}แทรกค่าจากฟิลด์
สตริงข้อความสามารถอ้างอิงฟิลด์แบบมีชื่อหรือแบบระบุตำแหน่งได้ ทำให้ข้อความข้อผิดพลาดมีข้อมูลบริบท
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ConfigError {
#[error("missing key: {key}")]
Missing { key: String },
#[error("value {0} out of range")]
OutOfRange(i32),
}สร้าง Display และ Error โดยอัตโนมัติ
derive จะสร้างทั้ง Display (จากข้อความของคุณ) และ std::error::Error ให้อัตโนมัติ จึงไม่ต้องเขียนบล็อก impl ด้วยตนเอง
ห่อข้อผิดพลาดต้นทาง
#[from] จะสร้าง impl ของ From เพื่อให้ตัวดำเนินการ ? แปลงข้อผิดพลาดพื้นฐานเป็นชนิดของคุณได้ ส่วน #[source] ใช้ระบุสาเหตุ
use thiserror::Error;
#[derive(Error, Debug)]
pub enum AppError {
#[error("io failure")]
Io(#[from] std::io::Error),
#[error("parse failure")]
Parse(#[from] std::num::ParseIntError),
}ใช้ร่วมกับ ?
ด้วย #[from] ตัวดำเนินการ ? จะแปลงข้อผิดพลาดมาตรฐานเป็น AppError ของคุณโดยอัตโนมัติ
fn read_number(path: &str) -> Result<i32, AppError> {
let text = std::fs::read_to_string(path)?; // io::Error -> AppError
let n: i32 = text.trim().parse()?; // ParseIntError -> AppError
Ok(n)
}สายโซ่ของสาเหตุ
เมื่อคุณห่อข้อผิดพลาด thiserror จะเปิดเผยสาเหตุผ่าน Error::source ทำให้สร้างสายโซ่ข้อผิดพลาดครบถ้วนสำหรับการบันทึกและการดีบักได้
ข้อผิดพลาดแบบโปร่งใส
#[error(transparent)] ส่งต่อทั้ง Display และแหล่งที่มาของข้อผิดพลาดที่ถูกห่อไว้ เหมาะสำหรับตัวเลือกที่ทำหน้าที่ส่งผ่าน
use thiserror::Error;
#[derive(Error, Debug)]
pub enum WrapError {
#[error(transparent)]
Other(#[from] std::io::Error),
}ควรใช้ thiserror เมื่อใด
เลือกใช้ thiserror เมื่อ:
- คุณกำลังเขียนไลบรารี
- ผู้เรียกจำเป็นต้องจับคู่กับตัวเลือกข้อผิดพลาดเฉพาะ
- คุณต้องการส่วนติดต่อ API ของข้อผิดพลาดที่มีชนิดชัดเจนและเสถียร
สำหรับแอปพลิเคชันที่เพียงต้องการส่งต่อข้อผิดพลาดขึ้นไป anyhow มักใช้ง่ายกว่า
จับคู่กับตัวเลือกข้อผิดพลาด
เนื่องจากข้อผิดพลาดนี้เป็นอีนัมจริง ผู้เรียกจึงใช้ match กับมันเพื่อจัดการความล้มเหลวแต่ละชนิดแตกต่างกันได้
fn handle(err: AppError) {
match err {
AppError::Io(_) => println!("retry the file operation"),
AppError::Parse(_) => println!("ask the user to fix input"),
}
}ตรวจสอบอย่างรวดเร็ว
แอตทริบิวต์ #[from] สร้างอะไรในอีนัมของ thiserror
สรุปทบทวน
คุณได้เรียนรู้ไลบรารี thiserror:
#[derive(Error)]สร้าง impl ของ Display และ Error#[error("...")]กำหนดข้อความพร้อมการแทรกค่าจากฟิลด์#[from]เปิดใช้การแปลงข้อผิดพลาดต้นทางด้วย?transparentส่งต่อไปยังข้อผิดพลาดที่ถูกห่อไว้- เหมาะอย่างยิ่งสำหรับ API ข้อผิดพลาดแบบมีชนิดของไลบรารี
เรียนรู้ Rust ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 39
- บทเรียน
- 144
คำถามที่พบบ่อย
บทเรียน “thiserror” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “thiserror” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “thiserror”
ชนิดข้อมูลข้อผิดพลาดแบบกำหนดเอง คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “thiserror” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ