0Pricing
Learn Rust Coding · บทเรียน

anyhow

ข้อผิดพลาดของแอปที่ยืดหยุ่น

anyhow เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

ข้อผิดพลาดของแอปพลิเคชันที่ยืดหยุ่น

ในโค้ดแอปพลิเคชัน คุณมักต้องการเพียงส่งต่อข้อผิดพลาดขึ้นไปพร้อมบริบท โดยไม่ต้องกำหนดอีนัมที่มีชนิดสำหรับข้อผิดพลาดแต่ละแบบ ไลบรารี anyhow มีชนิดข้อผิดพลาดเดียวที่ใช้ง่ายสำหรับกรณีนี้โดยเฉพาะ

เพิ่ม anyhow

เพิ่มไลบรารีนี้เป็นสิ่งที่ต้องพึ่งพา ไลบรารีนี้ทำงานร่วมกับ thiserror ได้ดี: ใช้ thiserror สำหรับไลบรารี และ anyhow สำหรับไบนารี

[dependencies]
anyhow = "1.0"

ชื่อย่อ anyhow::Result

anyhow::Result<T> เป็นรูปแบบย่อของ Result<T, anyhow::Error> ชนิด Error สามารถเก็บข้อผิดพลาดใด ๆ ที่ใช้ std::error::Error ได้

use anyhow::Result;

fn load() -> Result<String> {
    let text = std::fs::read_to_string("config.txt")?;
    Ok(text)
}

การแปลงโดยอัตโนมัติ

ตัวดำเนินการ ? จะแปลงข้อผิดพลาดมาตรฐานใด ๆ เป็น anyhow::Error โดยอัตโนมัติ คุณจึงใช้ชนิดข้อผิดพลาดต่าง ๆ ร่วมกันได้อย่างอิสระ

use anyhow::Result;

fn parse_file(path: &str) -> Result<i32> {
    let text = std::fs::read_to_string(path)?; // io error
    let n: i32 = text.trim().parse()?;          // parse error
    Ok(n)
}

เพิ่มบริบท

เมธอด .context() จะเพิ่มข้อความที่มนุษย์อ่านเข้าใจให้กับข้อผิดพลาด และสร้างสายโซ่ที่อ่านง่ายเมื่อเกิดความล้มเหลว

use anyhow::{Context, Result};

fn read_config(path: &str) -> Result<String> {
    let text = std::fs::read_to_string(path)
        .context("failed to read config file")?;
    Ok(text)
}

บริบทแบบประเมินภายหลัง

ใช้ with_context เมื่อการสร้างข้อความมีค่าใช้จ่ายสูงหรือต้องใช้ข้อมูลขณะทำงาน โดยคลอเชอร์จะทำงานเฉพาะเมื่อเกิดข้อผิดพลาด

use anyhow::{Context, Result};

fn open(path: &str) -> Result<String> {
    std::fs::read_to_string(path)
        .with_context(|| format!("could not open {path}"))
}

สร้างข้อผิดพลาดเฉพาะกิจ

มาโคร anyhow! สร้างข้อผิดพลาดจากข้อความ ส่วน bail! จะส่งคืนข้อผิดพลาดนั้นทันที

use anyhow::{anyhow, bail, Result};

fn check(age: i32) -> Result<()> {
    if age < 0 {
        bail!("age cannot be negative");
    }
    if age > 150 {
        return Err(anyhow!("age {age} is implausible"));
    }
    Ok(())
}

ใช้ ensure!

ensure! คล้ายกับ assert! แต่จะส่งคืนข้อผิดพลาดแทนการทำให้โปรแกรมตื่นตระหนก

use anyhow::{ensure, Result};

fn divide(a: i32, b: i32) -> Result<i32> {
    ensure!(b != 0, "division by zero");
    Ok(a / b)
}

anyhow ใน main

ส่งคืน anyhow::Result<()> จาก main เพื่อให้พิมพ์สายโซ่ข้อผิดพลาดในรูปแบบที่อ่านง่ายเมื่อเกิดความล้มเหลว

use anyhow::Result;

fn main() -> Result<()> {
    let text = std::fs::read_to_string("data.txt")?;
    println!("{text}");
    Ok(())
}

ตรวจสอบสาเหตุ

แม้ anyhow::Error จะไม่เปิดเผยรายละเอียด แต่คุณยังตรวจสอบมันได้ downcast_ref จะกู้คืนชนิดข้อผิดพลาดที่เป็นรูปธรรมเมื่อคุณต้องแยกการทำงานตามชนิดนั้น

use anyhow::Result;

fn report(err: anyhow::Error) {
    if let Some(io) = err.downcast_ref::<std::io::Error>() {
        println!("io error: {io}");
    } else {
        println!("other error: {err}");
    }
}

thiserror กับ anyhow

หลักทั่วไป:

  • thiserror — สำหรับไลบรารีและข้อผิดพลาดแบบมีชนิดที่ผู้เรียกจับคู่ได้
  • anyhow — สำหรับแอปพลิเคชันที่เพียงต้องการส่งต่อข้อผิดพลาดพร้อมบริบท

คุณสามารถแปลงข้อผิดพลาดของ thiserror เป็น anyhow ได้อย่างราบรื่นด้วย ?

ตรวจสอบอย่างรวดเร็ว

เมธอดใดของ anyhow ที่เพิ่มข้อความอธิบายให้ข้อผิดพลาดขณะส่งต่อ

สรุปทบทวน

คุณได้เรียนรู้ไลบรารี anyhow:

  • anyhow::Result<T> ใช้ชนิดข้อผิดพลาดเดียวที่ยืดหยุ่น
  • ? แปลงข้อผิดพลาดมาตรฐานใด ๆ โดยอัตโนมัติ
  • .context() / with_context() เพิ่มข้อความที่อ่านเข้าใจง่าย
  • anyhow!, bail! และ ensure! ใช้สร้างข้อผิดพลาด
  • เหมาะที่สุดสำหรับโค้ดแอปพลิเคชัน (ไบนารี)

คำถามที่พบบ่อย

บทเรียน “anyhow” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “anyhow” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “anyhow”

ข้อผิดพลาดของแอปที่ยืดหยุ่น คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “anyhow” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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