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

הסבר עם שליטה בשגיאות עם דוגמאות חיות ב-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, שווה להכיר ואולי גם להשתמש – בזהירות המתבקשת.

פוסטים נוספים שכדאי לקרוא

תמונה מצוירת של רובוט שמנקה HTML
יסודות בתכנות

סניטציה – למה זה חשוב

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

תמונת תצוגה של מנעול על מחשב
פתרונות ומאמרים על פיתוח אינטרנט

הגנה מפני XSS עם Trusted Types

תכונה ב-CSP שמאפשרת מניעה כמעט הרמטית להתקפות XSS שכל מפתח ווב צריך להכיר וכדאי שיכיר.

גלילה לראש העמוד