สัปดาห์ที่ 9 Exception Handling

จุดประสงค์การเรียนรู้

  1. แยกประเภทข้อผิดพลาดและ Exception ได้
  2. ใช้ try-catch เพื่อจัดการข้อยกเว้นได้
  3. สร้าง Custom Exception และบันทึก Log ได้

เนื้อหา

Exception

Exception คือเหตุการณ์ผิดปกติที่ทำให้โปรแกรมไม่สามารถทำงานต่อได้ตามปกติ เช่น ข้อมูลไม่ถูกต้อง ไฟล์หาย การหารด้วยศูนย์ หรือการเชื่อมต่อระบบล้มเหลว

try-catch

try-catch ใช้แยกโค้ดที่มีความเสี่ยงออกจากโค้ดจัดการข้อผิดพลาด ทำให้โปรแกรมตอบสนองต่อปัญหาได้อย่างควบคุมได้แทนที่จะหยุดทันที

Custom Exception

Custom Exception ช่วยสร้างประเภทข้อผิดพลาดเฉพาะของระบบ ทำให้ข้อความและการจัดการปัญหาชัดเจนขึ้น

Logging

Logging ใช้บันทึกเหตุการณ์สำคัญและข้อผิดพลาด เพื่อช่วยในการวิเคราะห์ปัญหาและตรวจสอบย้อนหลัง

Workshop

ปรับโปรแกรมอ่านไฟล์หรือรับข้อมูลผู้ใช้ให้มี Exception Handling และ Logging ที่เหมาะสม

รายละเอียดการเรียนรู้

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

Logging ควรบันทึกข้อมูลที่ช่วยแก้ปัญหา เช่น เวลา จุดที่เกิดเหตุการณ์ ข้อความ error และข้อมูลบริบทที่ไม่ละเมิดความเป็นส่วนตัว ไม่ควรบันทึกรหัสผ่านหรือข้อมูลลับ

แนวปฏิบัติ

  1. ไม่ซ่อน exception โดยไม่จัดการ
  2. จับ exception ให้เฉพาะเจาะจงเท่าที่ทำได้
  3. แยกข้อความสำหรับผู้ใช้กับรายละเอียดสำหรับ log
  4. ใช้ finally หรือ cleanup เพื่อคืนทรัพยากร

แบบฝึกหัด

เพิ่ม Exception Handling ให้โปรแกรม File Processing โดยมี Custom Exception อย่างน้อย 1 ประเภทและมี log ของเหตุการณ์สำคัญ

รูปแบบการนำเสนอเพิ่มเติมตามแม่แบบ

Exception Handling คือการจัดการเหตุการณ์ผิดปกติให้โปรแกรมหยุดอย่างปลอดภัยหรือฟื้นตัวได้ แทนที่จะปล่อยให้โปรแกรมล้มโดยไม่อธิบายสาเหตุ

%%{init: {'theme': 'base', 'themeVariables': {'background': '#282828','primaryColor': '#3c3836','primaryTextColor': '#fbf1c7','primaryBorderColor': '#fabd2f','lineColor': '#fb4934','secondaryColor': '#504945','tertiaryColor': '#665c54'}}}%%
flowchart LR
  A[Risky Code
โค้ดเสี่ยง] --> B{Error?
ผิดพลาดหรือไม่} B -- No --> C[Continue
ทำงานต่อ] B -- Yes --> D[Catch
จับ exception] D --> E[Log
บันทึกเหตุการณ์] E --> F[Recover/Stop
ฟื้นตัวหรือหยุดปลอดภัย]

สมการประเมินอัตราข้อผิดพลาด

E=fn×100%

ตัวอย่างโค้ดทดลอง

#include <iostream>
#include <stdexcept>
using namespace std;

double divide(double a, double b) {
    if (b == 0) {
        throw runtime_error("division by zero");
    }
    return a / b;
}

int main() {
    try {
        cout << divide(10, 0) << endl;
    } catch (const exception& e) {
        cout << "Error: " << e.what() << endl; // expected: Error message
    }
    return 0;
}
ส่วนประกอบ หน้าที่
try ครอบโค้ดที่อาจผิดพลาด
throw ส่ง exception
catch จัดการ exception
log บันทึกรายละเอียดเพื่อวิเคราะห์ย้อนหลัง

กลับรายวิชา