שליטה בשגיאות בפונקצית PHP

לא מזמן כתבתי מאמר על Error Handling ב-PHP. במאמר תיארתי דרך מורכבת (אך חשובה) לתפוס שגיאות ב-PHP ולעבוד איתן נכון בצורה חכמה. בשילוב try-catch או בלעדיהם. ישנה עוד דרך לטפל בשגיאות, שהיא יותר מזכירה hack אבל אם משתמשים בה באופן נכון אפשר להפיק ממנה תועלת. אני מדבר על PHP Error Control.

מה הכוונה? תמיד יותר טוב עם דוגמה. אני בטוח שחלק מכם שמעתם על SOAP. למי שלא מכיר, מדובר על פרוטוקול תקשורת מבוסס XML שמשתמשים בו בעיקר web services – אפליקציות שמתקשרות בעיקר עם אפליקציות אחרות. אם למשל כתבתם פעם אתר או אפליקציה ששאבה מידע מ-web service זה או אחר, סביר להניח שהשתמשתם ב-SOAP. אחת הדרכים הקלות יותר (לאו דווקא הנכונות, אבל ניחא) לתקשר עם web service מבוסס SOAP הוא לקחת את ה-XML שלו ולרנדר אותו באמצעות SimpleXML – תוסף של PHP שמטפל בעיבוד של XML. כך למשל, אם יש לי שירות מסוים שה-URL שלו הוא http://example.com/webservice.asmx, כל מה שאני צריך לעשות זה לקחת את ה-XML באמצעות:


$xml = simplexml_load_file('http://example.com/webservice.asmx');

פקודת simplexml_load_file טוענת את המשאב החיצוני וממירה אותו לאובייקט SimpleXML כשהרפרנס שלו במקרה הזה הוא המשתנה xml$. עד כאן זה פשוט, אבל כפי שאנחנו יודעים, לא תמיד ה-webservice עובד, לפעמים הוא נופל, לפעמים המתכנת בצד השני משתנה את שמות המתודות, לפעמים גם הפונקציה שקוראת לו קצת מחרבשת את השם – ואז יש לנו שגיאה.

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


$xml = @simplexml_load_file('http://example.com/webservice.asmx');
if(!$xml) {
//throw error, print error message, whatever
}

הפונקציה הזו לעולם לא תזרוק שגיאה, גם אם היא נכשלת מסיבה כלשהי.

דוגמה טובה נוספת לשימוש ב-@ היא אם אתם כותבים פונקציה שאתם לא מאד בטוחים מה סביבת הקוד שבה היא תרוץ. כך למשל, הפונקציה date_default_timezone_get עלולה להחזיר שגיאה בגרסת PHP מסוימת או כאשר היא מקבלת קלט מסוים (שמהניסיון שלי בהחלט יכול להתקבל), על מנת למנוע מצב כזה, פשוט כותבים את שם הפונקציה כך:


@date_default_timezone_get($input);

וכך שגיאה לא מתעופפת לה ותוקעת את הסקריפט שלכם.

ניתן גם לשלוט על משתנים בצורה הזו, אם למשל יש לי משתנה cache שיכול להיות קיים או שלא ואני לא יודע את זה, אני יכול לכתוב את הביטוי הבא:


$value = @$cache[$key];

במידה ואין cache, השורה הזו לא תעצור לי את כל הסקריפט.

כמובן, שכמו כל דבר, צריך לדעת מתי לא להשתמש בזה. שימוש לא זהיר בשליטה בשגיאות יכול להוביל לכך שהסקריפט שלכם ימות ולכם לא יהיה מושג למה (כיוון ששום שגיאה לא תודפס). לא הייתי ממהר לזנוח את ה-Error exception ש-PHP מציעה. אך למקרים נקודתיים כמו קריאה ל-API, סקריפט שמשתמש בפונקציות חדשות רץ בסביבות לא ידועות או cache, שווה להכיר ואולי גם להשתמש – בזהירות המתבקשת.

כדאי תמיד להשאר מעודכנים! הרשמו לעדכונים של האתר במייל! - המייל יישלח כל יום ראשון בעשר בבוקר ויכיל אך ורק את המאמרים שהתפרסמו באינטרנט ישראל. ללא ספאם, ללא הצפות, ללא בלגנים. 🙂

אהבתם? לא אהבתם? דרגו!

לא אהבתי בכלללא אהבתיבסדראהבתיאהבתי מאוד (אין הצבעות)

תגיות: פורסם בקטגוריה: פתרונות ומאמרים על פיתוח אינטרנט

אל תשארו מאחור! יש עוד מה ללמוד!

הצטרפו לעדכונים!

העדכונים נשלחים אך ורק כאשר האתר מתעדכן.

רן בר-זיק

רן בר-זיק כותב כל המאמרים באינטרנט ישראל, מפתח אינטרנט מנוסה במגוון שפות ופלטפורמות.
ניתן ליצור איתי קשר באמצעות:
כתובת המייל שלי: info@internet-israel.com.
פרופיל הלינקדאין שלי
הטוויטר שלי
פרופיל הפייסבוק שלי
אני תמיד שמח לייעץ ולעזור, אך בשל עומס הפניות הרב, אני לא תמיד מצליח לענות במהירות.

מאמרים אחרונים