Menu
CoddyTech

קריאות מוגנות באמצעות 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() תופסת אותה. התוכנית ממשיכה לפעול ויכולה לטפל בשגיאה בצורה נאותה באמצעות בדיקת ערך המצב.

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

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 אונליין