תפיסת שגיאות באמצעות tryCatch()
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-R של Coddy. שיעור 53 מתוך 64.
tryCatch(expr, error = function(e) ...) מריץ את expr. אם מתרחשת שגיאה, מטפל השגיאה רץ במקום זאת והערך שלו הופך לתוצאה, והתסריט ממשיך:
safe_sqrt <- function(x) {
tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")פלט:
[1] 4
[1] NA
[1] "still running"מטפל השגיאות מקבל את השגיאה בתור e, ו־conditionMessage(e) מחזירה את טקסט ההודעה שלה:
result <- tryCatch(
stop("file not found"),
error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)פלט:
[1] "Problem: file not found"עטפו רק את הקריאה שעלולה להיכשל, ותפסו את השגיאה במקום שבו תוכלו לעשות משהו מועיל, כמו להחזיר ערך ברירת מחדל או להציג הודעה למשתמש:
to_number <- function(s) {
tryCatch({
if (s == "") stop("empty input")
as.integer(s)
}, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))פלט:
[1] 42
[1] -1בלולאה, tryCatch() מאפשר לפריט בעייתי אחד להיכשל, בזמן שהפריטים האחרים ממשיכים להיות מעובדים:
inputs <- list(4, "x", 9)
for (v in inputs) {
r <- tryCatch(sqrt(v), error = function(e) "not a number")
cat(format(v), "->", r, "\n")
}פלט:
4 -> 2
x -> not a number
9 -> 3 אתגר
קלהשלימו את safe_divide(a, b). השתמשו ב־tryCatch(): בתוכו, העלו את השגיאה division by zero כאשר b הוא 0, ובכל מקרה אחר חשבו את a / b. מטפל השגיאות מחזיר את Error: ואחריו את ההודעה. החזירו את התוצאה כשהיא מעוגלת לשתי ספרות עשרוניות כטקסט, 3.33, או את טקסט השגיאה.
הקוד שסופק קורא זוגות של מספרים כגון 10/3, המופרדים בפסיקים, ומדפיס את התוצאה של כל זוג בשורה נפרדת.
נסו בעצמכם
safe_divide <- function(a, b) {
# כתבו את הקוד שלכם כאן
""
}
# קוד קלט/פלט שסופק: השאירו אותו כפי שהוא
input <- suppressWarnings(readLines(file("stdin")))
for (pair in strsplit(input[1], ",")[[1]]) {
p <- as.numeric(strsplit(pair, "/")[[1]])
cat(safe_divide(p[1], p[2]), "\n", sep = "")
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מחרוזות לעומק
תת־מחרוזות עם substr()עיצוב עם sprintf()פיצול וחיבורחיפוש במחרוזותהחלפת טקסטסיכום – בונה שמות משתמש4מטריצות
יצירת מטריצותאינדוקס מטריצותסיכומי שורות ועמודותאריתמטיקה של מטריצותסיכום – תרשים מקומות ישיבה2שליפות לפי מפתח-ערך
שליפת וקטורים לפי שםבדיקת מפתחותהוספה והסרה של מפתחותמעבר בלולאה על שמותחזרה – דלפק המניות11טיפול בשגיאות
העלאת שגיאות באמצעות stop()תפיסת שגיאות באמצעות tryCatch()אזהרות ו-finallyאימות קלטסיכום – מחשבון בטוחתרגלו בעצמכם: קומפיילר R אונליין