Learn Rust Coding · บทเรียน

thiserror

ชนิดข้อมูลข้อผิดพลาดแบบกำหนดเอง

บทเรียน 2 จาก 413 ขั้นตอน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Result และตัวดำเนินการ ?
  2. thiserror
  3. anyhow
  4. การแปลงข้อผิดพลาด
← กลับไปที่ Learn Rust Coding