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