מטפל לכל סוגי החריגות
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-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;
}מטפל ברירת המחדל משמש כמענה חלופי לכל סוג חריגה שלא נתפס על ידי הבלוקים הקודמים. הדבר שימושי במיוחד כשעובדים עם קוד שעלול להעלות חריגות שלא צפית להן, ומבטיח שהתוכנית שלך לא תקרוס בגלל שגיאות בלתי צפויות.
גם אם אינך יכול לגשת לפרטים הספציפיים של החריגה בבלוק שתופס את כל החריגות, עדיין תוכל לספק הודעת שגיאה כללית ולבצע פעולות ניקוי כדי שהתוכנית שלך תמשיך לפעול בצורה חלקה.
אתגר
קלצרו תוכנית שמדגימה טיפול מקיף בחריגות באמצעות כמה בלוקי catch, כולל מטפל שתופס את כל סוגי החריגות. האתגר הזה יבחן את ההבנה שלכם כיצד לטפל גם בסוגי חריגות מסוימים וגם בשגיאות בלתי צפויות שאינן שייכות לקטגוריות שהוגדרו מראש.
הקלטים הבאים יסופקו:
- מחרוזת
testTypeשמייצגת את סוג הבדיקה שיש לבצע ("string_convert","math_operation","array_access"או"unknown_error") - מחרוזת
value1שתשמש כנתונים העיקריים עבור הפעולה - מחרוזת
value2שתשמש כנתונים משניים עבור פעולות מסוימות
התוכנית שלכם צריכה:
- ליצור פונקציה בשם
performTestשמקבלת שלושה פרמטרים מסוג מחרוזת - בתוך הפונקציה, להשתמש במבנה if-else כדי לטפל בסוגי בדיקות שונים:
- אם testType הוא
"string_convert": להשתמש ב-std::stoiכדי להמיר את value1 למספר שלם ולהדפיס אותו - אם testType הוא
"math_operation": להמיר גם את value1 וגם את value2 למספרים שלמים באמצעותstd::stoi, ואז לחלק את value1 ב-value2 ולהדפיס את התוצאה - אם testType הוא
"array_access": ליצור מחרוזת"Programming", להמיר את value1 לאינדקס של מספר שלם באמצעותstd::stoi, ואז להשתמש ב-str.at(index)כדי לגשת לתו באותו אינדקס ולהדפיס אותו. המתודה.at()זורקת אוטומטית אתstd::out_of_rangeאם האינדקס אינו תקין: אין צורך בבדיקת גבולות ידנית - אם testType הוא
"unknown_error": לזרוק ערך של מספר שלם999 - בפונקציה הראשית, לקרוא ל-
performTestבתוך בלוקtry - להשתמש בכמה בלוקי
catchכדי לטפל בחריגות לפי הסדר המדויק הזה: - ראשון:
std::invalid_argument&עבור המרות לא תקינות ממחרוזת למספר - שני:
std::out_of_range&עבור מספרים גדולים מדי או אינדקס מחרוזת מחוץ לטווח - שלישי:
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;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטים8טיפול בסיסי בשגיאות
מבוא לחריגותבלוקי 'try' ו-'catch'מילת המפתח 'throw'סוגים שונים של חריגותמטפל לכל סוגי החריגותסיכום – חלוקה בטוחהתרגלו בעצמכם: קומפיילר C++ אונליין