נתחיל מכלל האצבע
לעולם, לעולם, לעולם(!) אין לזרוק Excpetions מ Destructorולמה?
כאשר נזרק excpetion, מתבצע תהליך של stack unwinding. מה זאת אומרת? הסטאק מתחיל להתנקות מכל האובייקטים שהוקצו עליו,
החל מהנקודה שעשינו throw X ועד הנקודה שעשינו catch X(או במקרה שאין catch, עד ה default exception handler שמוגדר על ידי ה runtime).
אם במהלך אחד מה-DTORים האלה נזרק אקספשן נוסף -
ה runtime של C++ יקרא אוטומטית לפונקציה terminate() ויסיים את ריצת התוכנית!
למה זה הגיוני? נניח שיש לנו DTOR אחד שזורק LiranException. אחרי שה-Exception נזרק,
מתחיל תהליך הנקיון של הסטאק(unwinding) שבמהלכו נקרא ה destructor של אובייקט כלשהו שהיה לנו במחלקה.
האובייקט הזה, בתורו, זורק גם הוא אקספשן ב destructor, מסוג OmerException.מה עושים עכשיו? עד לאן צריך לעשות unwinding?
עד catch(OmerException&)? עד catch(LiranException&)?
התקן של C++ החליט שבכל מצב, אנחנו נפסיד פה משהו.
הרי אי אפשר ללכת לשניהם, כי אי אפשר להחזיק שני EXCEPTIONים ברגע נתון (אבל על זה, בפעם אחרת).
אמנם, אפשר לומר "אז בעצם, אם מובטח שרק אובייקט אחד בכל רגע נתון זורק
excpetion ב- DTOR, אז הכל בסדר"
נכון. אבל עדיין, בחיים לא עושים את זה. כי מתכנתים אחרים יכולים לא
לדעת את זה. ומעבר לזה - זה ממש ממש מכוער.
אז הכלל הוא:
לעולם, לעולם, לעולם(!) אין לזרוק Excpetions מ Destructor
אז תשאלו: "רגע, לירן, אז מתי כן אפשר לזרוק excpetionים ב desutrctor?"
והתשובה היא: אף פעם
"בלי חריגות?"
בלי! לעולם, לעולם, לעולם(!) אין לזרוק Excpetions מ Destructor
אני מקווה שהבהרתי את הכוונה שלי
אם יש שאלות - אשמח לענות.
מקווה שנהניתם - עד הפעם הבאה.
לירן
\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser