0Pricing
C++ Academy · บทเรียน

รูปแบบการจัดการข้อผิดพลาด

ประกอบ optional และ expected

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

เครื่องมือสองแบบ เป้าหมายเดียว

std::optional และ std::expected ต่างก็ใช้แทนค่าพิเศษที่มักก่อให้เกิดข้อผิดพลาดได้ บทเรียนนี้จะแสดงรูปแบบการนำทั้งสองแบบมารวมและเชื่อมต่อกันอย่างเป็นระเบียบ

ส่งคืนก่อนเมื่อว่าง

นี่เป็นรูปแบบที่เรียบง่ายและอ่านง่าย: ตรวจสอบออปชันนัล แล้วหยุดการทำงานตั้งแต่เนิ่น ๆ หากไม่มีค่า ก่อนดำเนินการต่อ

#include <iostream>
#include <optional>
std::optional<int> parse(bool ok) { return ok ? std::optional<int>(5) : std::nullopt; }
int main() {
    auto v = parse(true);
    if (!v) { std::cout << "no value\n"; return 0; }
    std::cout << *v + 1 << "\n";
}

แปลงออปชันนัลเป็นเอ็กซ์เปกเต็ด

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

#include <expected>
#include <optional>
#include <string>
std::expected<int, std::string> require(std::optional<int> o) {
    if (o) return *o;
    return std::unexpected("value missing");
}
int main() {}

การเชื่อมต่อด้วย value_or

เมื่อผลลัพธ์จากการค้นหาหลายครั้งถูกรวมเข้าด้วยกันเป็นผลลัพธ์เดียว value_or ช่วยให้คุณระบุค่าเริ่มต้นไว้ในนิพจน์ได้โดยไม่ต้องซ้อน if หลายชั้น

#include <iostream>
#include <optional>
int setting(std::optional<int> user, int fallback) {
    return user.value_or(fallback);
}
int main() {
    std::cout << setting(std::nullopt, 42) << "\n";
}

ส่งต่อข้อผิดพลาดขึ้นไป

ด้วย std::expected ฟังก์ชันสามารถตรวจสอบการเรียกย่อยและส่งต่อข้อผิดพลาดเดิมโดยไม่เปลี่ยนแปลง เพื่อสร้างไปป์ไลน์ข้อผิดพลาด

#include <expected>
#include <string>
using R = std::expected<int, std::string>;
R step1(bool ok) { return ok ? R(2) : R(std::unexpected("step1 failed")); }
R run(bool ok) {
    auto r = step1(ok);
    if (!r) return std::unexpected(r.error());
    return *r * 10;
}
int main() {}

and_then แบบโมนาดิก

and_then ของ C++23 เชื่อมการดำเนินการที่แต่ละรายการส่งคืนออปชันนัลหรือเอ็กซ์เปกเต็ดเข้าด้วยกัน โดยหยุดทันทีเมื่อพบความล้มเหลวครั้งแรกและไม่ต้องเขียนลำดับ if ด้วยตนเอง

การแมปด้วย transform

transform ใช้ฟังก์ชันทั่วไปกับค่าที่สำเร็จ และคงข้อผิดพลาดหรือสถานะว่างไว้เหมือนเดิม จึงแมปเฉพาะเส้นทางที่สำเร็จ

or_else สำหรับการกู้คืน

or_else เรียกใช้กลไกสำรองที่สามารถจัดหาค่าทดแทนหรือข้อผิดพลาดทางเลือกได้ เมื่อค่าเดิมว่างเปล่าหรือการดำเนินการล้มเหลว

เลือกใช้ระหว่างสองแบบ

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

หลีกเลี่ยงค่าพิเศษแบบผสม

อย่าผสมรหัสข้อผิดพลาดแบบเดิมกับออปชันนัลหรือเอ็กซ์เปกเต็ดไว้ใน API เดียวกัน โปรดเลือกกลยุทธ์ที่สอดคล้องกันหนึ่งแบบ เพื่อให้ผู้เรียกจัดการความล้มเหลวได้ในรูปแบบเดียวกัน

กำหนดชนิดข้อผิดพลาดให้ชัดเจน

ควรใช้ enum หรือ struct ขนาดเล็กเป็นประเภทข้อผิดพลาด แทนการใช้สตริงเปล่าเมื่อมีการตรวจสอบความล้มเหลวในโปรแกรม ส่วนสตริงเหมาะที่สุดสำหรับข้อความที่แสดงต่อผู้ใช้

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจของคุณเกี่ยวกับรูปแบบการจัดการข้อผิดพลาด

สรุป

คุณได้เรียนรู้เกี่ยวกับ รูปแบบการจัดการข้อผิดพลาด:

  • การส่งคืนก่อนเมื่อไม่มีค่าหรือเกิดข้อผิดพลาดช่วยให้โค้ดไม่ซ้อนกันหลายชั้น
  • แปลงออปชันนัลเป็นเอ็กซ์เปกเต็ดเมื่อจำเป็นต้องระบุสาเหตุ
  • เชื่อมการทำงานด้วย and_then, transform, or_else (C++23)
  • ใช้แนวทางให้สอดคล้องกัน และหลีกเลี่ยงการผสมค่าพิเศษกับออปชันนัลหรือเอ็กซ์เปกเต็ด

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

บทเรียน “รูปแบบการจัดการข้อผิดพลาด” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบการจัดการข้อผิดพลาด”

ประกอบ optional และ expected คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

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

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

บทเรียน “รูปแบบการจัดการข้อผิดพลาด” ใช้เวลานานแค่ไหน

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

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

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

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

  1. การแทนค่าที่ไม่มีอยู่ด้วย optional
  2. การเข้าถึงค่า optional
  3. พื้นฐาน std::expected
  4. รูปแบบการจัดการข้อผิดพลาด
← กลับไปที่ C++ Academy