Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

การจับข้อยกเว้นของคลาสฐานและคลาสลูกใน C++

เพื่อจับข้อยกเว้น (catch exception) ให้ได้ทั้งคลาสฐาน (base class) และคลาสลูก (derived class) จำเป็นต้องวางบล็อก catch ของคลาสลูก **ก่อน** บล็อก catch ของคลาสฐาน มิฉะนั้น บล็อก catch ของคลาสลูกจะไม่มีโอกาสถูกเรียกใช้เลย

อัลกอริทึม

เริ่มต้น
  ประกาศคลาส B
  ประกาศคลาส D ที่สืบทอดจากคลาส B
  ประกาศอ็อบเจ็กต์ของคลาส D
  Try: throw derived
  Catch (D derived)
    แสดง "Caught Derived Exception"
  Catch (B b)
    แสดง "Caught Base Exception"
สิ้นสุด

ตัวอย่างที่ 1: Catch คลาสลูกก่อน (ถูกต้อง)

#include <iostream>
using namespace std;

class B {};
class D: public B {}; // D สืบทอดจาก B

int main() {
    D derived;
    try {
        throw derived;
    }
    catch(D derived) {
        cout << "Caught Derived Exception"; // catch ของคลาสลูก
    }
    catch(B b) {
        cout << "Caught Base Exception"; // catch ของคลาสฐาน
    }
    return 0;
}

ผลลัพธ์

Caught Derived Exception

ตัวอย่างที่ 2: Catch คลาสฐานก่อน (ผิดพลาด)

#include <iostream>
using namespace std;

class B {};
class D: public B {};

int main() {
    D derived;
    try {
        throw derived;
    }
    catch(B b) {
        cout << "Caught Base Exception"; // catch ของคลาสฐาน
    }
    catch(D derived) {
        cout << "Caught Derived Exception"; // catch ของคลาสลูก - จะไม่ถูกเรียกเลย
    }
    return 0;
}

ผลลัพธ์

Caught Base Exception

ดังนั้นพิสูจน์แล้วว่า ต้องวาง catch block ของคลาสลูกก่อนคลาสฐาน มิฉะนั้น catch block ของคลาสลูกจะไม่มีโอกาสถูกเรียกใช้