דף הבית  שיעורים  נושאים מתקדמים  טיפול ב-exceptions - המשך
 
טיפול ב-exceptions - המשך
 
פקודות ה-throw לא חייבות להיות באותה הפונקציה שבה פקודות ה-catch ובלוק ה-try. למעשה, לרוב הן באמת לא יופיעו יחד. לדוגמא:

void f1(int x)
{
 if (x<0)
  throw "invalid param";
 else if (x==0)
  throw 0;
 printf("param is valid");
}

int Sample(int x)
{
 try
 {
  f1(x);
 }
 catch (int a)
 {
  printf("A %d was thrown!", a);
 }
 catch (char *s)
 {
  printf("%s", s);
 }
 return 0;
}
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

במקרה זה, הפונקציה f1 תהיה זו שתזרוק exception, והוא ייתפס ב-catch, בפונקציה הקוראת, Sample.
זכור שפקודות ה-catch יתבצעו במידה ונזרקה שגיאה. במידה ובלוק ה-try הסתיים בהצלחה הן לא תתבצענה והרצת התוכנית תמשיך מהפקודה הבאה אחריהן.
פקודות ה-catch בהן השתמשנו עד עכשיו, השתמשו בפרמטרים כמו int ומצביע ל-char. למרות שפרמטרים אלו מותרים, לא זאת הדרך בה אמורים לעבוד עם exceptions.
הזכרנו בהתחלה שטיפול ב-exceptions מאפשר לספריית מחלקות לדווח על שגיאות לפונקציות שמשתמשות בה.
אבל אם נניח שיש שתי ספריות המשמשות תוכנית, ושתיהן זורקות exception עם פרמטר int, דבר זה יקשה עליך להשתמש בפקודות catch נפרדות לכל אחת מהספריות.
כדי להימנע מבעיה זו, הפרמטר הנזרק יהיה לרוב אובייקט של מחלקה מיוחדת בתוך המחלקה.
לדוגמא, נתבונן במחלקת ה-Date בה השתמשנו בשיעורים קודמים, ונוסיף לה זריקת שגיאה בכל פעם שמנסים לשנות את ערך החודש בתאריך למספר קטן מ-1 או גדול מ-12:

class Date {
 int day;
 int month;
 int year;
public:
 Date();
 class MonthRange{};
 void Set(int year, int month, int day);
};
העבר את העכבר על שורות הקוד בכדי לקבל הסבר מפורט

לצורך כך הוספנו את המחלקה MonthRange בתוך המחלקה Date. למחלקה MonthRange אין נתונים ופונקציות משל עצמה. היא מוגדרת רק כדי לייצג טיפוס מיוחד בו משתמשים כדי לזרוק שגיאה.
אובייקט זה לא יתנגש עם טיפוסי שגיאות של מחלקות אחרות מכיוון שהוא ייחודי למחלקה זו.