חריגות ב- C++

מבנה נתונים ואלגוריתמים

 

 

C++ מגדירה מנגנון שדומה במקצת למנגנון הטיפול בחריגות ב- Ada, כשהיא מאפשרת להשתמש בהצהרת ה- throw כאשר מאותרת טעות. כשקוראים ל- throw מתרחש מעבר מיידי לשגרת ה- catch.

 

תחילה יש להגדיר בלוק try אשר סוגר את הקוד "הנורמלי" (ללא החריגה). בלוק ה- try

מלווה במספר בלוקים של  catch: אם קוד בבלוק try זורק חריגה, היא נתפסת על ידי אחד מהבלוקים של ה- catch.

 

try {

    classX x;

    x.mangle( 2 );

    x.straighten( -2 );

    }

catch( const char *string ) { ..... }

catch( RangeErr &re ) { .... }

catch( ... ) {

    // catches any other error

    ....

    }

 

הבנאי של המחלקה classX והמתודות mangle ו- straighten, מכילים הצהרות throw למקרה שתקרנה בעיות:

 

classX::mangle( int degree ) {

     if ( degree  MAX_MANGLE )

         throw "Can't mangle this much!";

     .... // Normal code for mangle

     }

 

 

ה- throw גורם לקפיצה ישירות אל מחוץ לפונקצית mangle, לעבר בלוק ה- catch, תוך דילוג על ההצהרות העוקבות בבלוק ה- try.

 

בכל אופן, כמו שמאפיין בדרך כלל את C++, החוקים אשר משמשים על מנת לקשר בין throw ל- catch המתאים, הם מסובכים מדי מכדי מלרדת לעומקם.

 

הערה היסטורית: מהדרים מוקדמים רבים ב- C++ לא יישמו את מערכת throw/chatch (ככל הנראה בגלל מורכבותה הרבה שאותה הזכרנו), ומספר ספרים מתעלמים מכך, או מדווחים על כך רק בעמודים האחרונים.

 

בעיקרון, כמו בדרך כלל ב- C++, מנגנון ה- throw/catch יעיל ביותר כשמשתמשים בו בדרך פשוטה, כגון על ידי הקצאת בלוק בודד של catch עם פרמטר אחד של int או enum! המנגנון הפשוט והאלגנטי של Ada עשוי להיות פחות חזק (מנגנון טיפול בחריגות לא מועבר בפרמטר), אך הוא קל יותר להבנה ולשימוש.

 

המשך ל: חריגות בג'אווה                       חזור ל: תוכן עניינים