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