รูปแบบการจัดการข้อผิดพลาด
ประกอบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การแทนค่าที่ไม่มีอยู่ด้วย optional
- การเข้าถึงค่า optional
- พื้นฐาน std::expected
- รูปแบบการจัดการข้อผิดพลาด