เพื่อจับข้อยกเว้น (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 ของคลาสลูกจะไม่มีโอกาสถูกเรียกใช้