Menu
Coddy logo textTech

קריאות מוגנות באמצעות pcall()

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-Lua של Coddy. שיעור 33 מתוך 54.

בעוד ש־error() עוצרת את התוכנית שלך כשמשהו משתבש, לפעמים רוצים לטפל בשגיאות בלי לגרום לקריסה. הפונקציה pcall() של Lua מאפשרת לך להריץ בבטחה קוד שעלול להיכשל.

השם pcall() פירושו "קריאה מוגנת". הוא עוטף קריאה לפונקציה בשכבת הגנה שתופסת כל שגיאה. במקום שהתוכנית שלך תקרוס, pcall() מחזירה מידע על מה שקרה.

הנה התחביר הבסיסי:

local status, result = pcall(functionName, arg1, arg2)

הפונקציה pcall() מחזירה שני ערכים. הראשון הוא מצב בוליאני: true אם הפונקציה הצליחה, או false אם אירעה שגיאה. הערך השני תלוי במצב: אם הפעולה הצליחה, זהו הערך שהפונקציה מחזירה; אם אירעה שגיאה, זו הודעת השגיאה.

הנה דוגמה מעשית:

function divide(a, b)
    if b == 0 then
        error("Cannot divide by zero")
    end
    return a / b
end
local success, result = pcall(divide, 10, 0)
if success then
    print("Result: " .. result)
else
    print("Error caught: " .. result)
end

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

challenge icon

אתגר

קל

כתבו פונקציה safeCalculate שמקבלת את operation, את a ואת b, ומחזירה את תוצאת החישוב או הודעת שגיאה.

הפונקציה צריכה להשתמש ב-pcall() כדי לבצע בבטחה את הפעולה המתמטית המבוקשת. צרו פונקציה פנימית שמבצעת את החישוב לפי מחרוזת הפעולה, ואז עטפו אותה ב-pcall() כדי ללכוד שגיאות.

לוגיקה:

  • צרו פונקציה פנימית שבודקת את סוג הפעולה ומבצעת את החישוב
  • עבור "add", החזירו את a + b
  • עבור "subtract", החזירו את a - b
  • עבור "multiply", החזירו את a * b
  • עבור "divide", בדקו אם b הוא 0 וקראו ל-error("Division by zero", 0) אם כן; אחרת, החזירו את a / b
  • עבור כל פעולה אחרת, קראו ל-error("Invalid operation", 0)
  • השתמשו ב-pcall() כדי להפעיל את הפונקציה הפנימית
  • אם הפעולה הצליחה, החזירו את "Result: " ואחריו את התוצאה
  • אם מתרחשת שגיאה, החזירו את "Error: " ואחריו את הודעת השגיאה

העבירו את 0 כארגומנט השני של error(). הארגומנט הזה הוא רמת השגיאה, ו-0 מורה ל-Lua לא להוסיף את שם הקובץ ואת מספר השורה לפני ההודעה, כך שהמחרוזת המוחזרת תהיה בדיוק "Error: Division by zero".

פרמטרים:

  • operation (מחרוזת): הפעולה שיש לבצע ("add", "subtract", "multiply", או "divide")
  • a (מספר): האופרנד הראשון
  • b (מספר): האופרנד השני

ערך מוחזר: מחרוזת שמכילה את "Result: " ואחריו את תוצאת החישוב, או את "Error: " ואחריו את הודעת השגיאה (מחרוזת)

נסו בעצמכם

function safeCalculate(operation, a, b)
    -- כתבו כאן קוד
    -- הערה: קראו ל־error(message, 0) כדי ש־Lua לא תוסיף את שם הקובץ ואת
    -- מספר השורה לפני ההודעה שלכם.
end
quiz iconבחנו את עצמכם

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

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

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