Menu
Coddy logo textTech

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

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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++ אונליין