Menu
CoddyTech

מטפל לכל סוגי החריגות

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 52 מתוך 56.

לפעמים התוכנית שלך עלולה להיתקל בשגיאות בלתי צפויות שאינן מתאימות לסוגי החריגות הספציפיים שתכננת לטפל בהם. מטפל החריגות הכללי catch(...) מספק רשת ביטחון שתופסת כל חריגה שלא טופלה בבלוקי catch הספציפיים יותר.

מטפל הלכידה הכללי משתמש בשלוש נקודות (...) במקום לציין סוג חריגה מסוים. יש למקם אותו אחרי כל בלוקי catch האחרים, מכיוון ש־C++ בודקת אותם לפי הסדר:

try {
    // קוד שעלול לזרוק חריגות שונות
} catch (std::invalid_argument& e) {
    std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
    std::cout << "Number too large!" << std::endl;
} catch (...) {
    std::cout << "An unexpected error occurred!" << std::endl;
}

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

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

challenge icon

אתגר

קל

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

הקלטים הבאים יסופקו:

  • מחרוזת testType שמייצגת את סוג הבדיקה שיש לבצע ("string_convert", "math_operation", "array_access" או "unknown_error")
  • מחרוזת value1 שתשמש כנתונים העיקריים עבור הפעולה
  • מחרוזת value2 שתשמש כנתונים משניים עבור פעולות מסוימות

התוכנית שלכם צריכה:

  1. ליצור פונקציה בשם performTest שמקבלת שלושה פרמטרים מסוג מחרוזת
  2. בתוך הפונקציה, להשתמש במבנה if-else כדי לטפל בסוגי בדיקות שונים:
  3. אם testType הוא "string_convert": להשתמש ב-std::stoi כדי להמיר את value1 למספר שלם ולהדפיס אותו
  4. אם testType הוא "math_operation": להמיר גם את value1 וגם את value2 למספרים שלמים באמצעות std::stoi, ואז לחלק את value1 ב-value2 ולהדפיס את התוצאה
  5. אם testType הוא "array_access": ליצור מחרוזת "Programming", להמיר את value1 לאינדקס של מספר שלם באמצעות std::stoi, ואז להשתמש ב-str.at(index) כדי לגשת לתו באותו אינדקס ולהדפיס אותו. המתודה .at() זורקת אוטומטית את std::out_of_range אם האינדקס אינו תקין: אין צורך בבדיקת גבולות ידנית
  6. אם testType הוא "unknown_error": לזרוק ערך של מספר שלם 999
  7. בפונקציה הראשית, לקרוא ל-performTest בתוך בלוק try
  8. להשתמש בכמה בלוקי catch כדי לטפל בחריגות לפי הסדר המדויק הזה:
  9. ראשון: std::invalid_argument& עבור המרות לא תקינות ממחרוזת למספר
  10. שני: std::out_of_range& עבור מספרים גדולים מדי או אינדקס מחרוזת מחוץ לטווח
  11. שלישי: catch(...) בתור המטפל שתופס את כל סוגי החריגות האחרים

השתמשו בפורמט הפלט המדויק הבא:

עבור פעולות שהצליחו:

Success: [result_value]

עבור סוגי חריגות שונים:

Invalid argument caught
Out of range caught
Unknown exception caught

זכרו שיש למקם את המטפל שתופס את כל סוגי החריגות, catch(...), אחרון, מכיוון ש-C++ בודקת את בלוקי catch לפי הסדר. המטפל הזה יתפוס כל סוג חריגה שלא טופל בבלוקי catch הספציפיים הקודמים, כולל החריגה מסוג מספר שלם שנזרקת במקרה של "unknown_error". המטפל שתופס את כל סוגי החריגות מספק רשת ביטחון לשגיאות בלתי צפויות, ובו בזמן מאפשר טיפול ספציפי בסוגי חריגות מוכרים.

נסו בעצמכם

#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;

// TODO: כתבו כאן את הקוד שלכם - צרו את הפונקציה performTest

int main() {
    // קראו את הקלט
    string testType;
    string value1;
    string value2;
    
    cin >> testType;
    cin >> value1;
    cin >> value2;
    
    // TODO: כתבו את הקוד שלכם בהמשך - מימשו בלוקים של try-catch וקראו ל-performTest
    
    return 0;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C++ אונליין