אינטרנט ישראל
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
  • ראשי
  • אודות רן בר-זיק ואינטרנט ישראל
  • ערוץ טלגרם
  • מסטודון
  • התחברו אלי בטוויטר
  • התחברו אלי בלינקדאין
  • ספר ג'אווהסקריפט
ראשי » פיתוח אינטרנט » פתרונות ומאמרים על פיתוח אינטרנט » תפיסת Exceptions ב-PHP

תפיסת Exceptions ב-PHP

רן בר-זיק דצמבר 11, 2011 7:27 am אין תגובות

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

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.

לא מזמן, בעקבות מאמר אחר שבו כתבתי על cURL, כתבתי מאמר על try-catch ומיד חטפתי (שוב) קיתונות של רותחין (שוב) על למה לא פירטתי על Exceptions ב-PHP. אז אולי המאמר הזה הוא הזדמנות מצוינת לדבר קצת על Exceptions.

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

בואו ונדגים באמצעות דוגמה מ-php.net, אני אצור פונקציה שמה שהיא עושה זה להחזיר את המספר ההופכי – למשל אם אני דוחף לפונקציה 2, אני אקבל 1/2, אם אני אדחוף לפונקציה 3, אני אקבל 1/3 וכך הלאה.

וכך הפונקציה נראית:


<?php
function inverse($x) {
	return 1/$x;
}

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


<?php
function inverse($x) {
	return 1/$x;
}

inverse(0);

יניב לי אזהרת PHP לא סימפטית במיוחד:

שגיאת PHP המתקבלת כתוצאה מחילוק באפס
שגיאת PHP המתקבלת כתוצאה מחילוק באפס

המתכנת המתחיל בטח יגיד: 'אז מה?!? מי האידיוט שיכניס אפס לפונקציה הזו?' אבל זה בדיוק ההבדל בין תכנות סקלבילי ועמיד בפני בעיות ובין תכנות פריך שכל שינוי ונגיעה בו גורמים לקריסתו ולברדק אדיר.

המתכנת המנוסה יותר, יכניס תנאי שיבדוק את הקלט המתקבל ויחזיר משהו אחר אם הקלט בעייתי:


< ?php
function inverse($x) {
    if (!$x) {
        print 'Number is zero!!!! ahhhh!';
		return 'n/a';
    }
    else return 1/$x;
}

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

דרך ההתמודדות עם התקלה היא פרימיטיבית למדי – הדפסה היסטרית משהו של 'תקלה חמורה'. אבל, וזה אבל גדול, מדובר בדרך שמתאימה לאפליקציות קטנות בלבד. באפליקציה שבה יש יותר מכמה מאות שורות, דרך התמודדות כזו תהיה בעייתית. לא תמיד אנחנו יכולים להדפיס ולא תמיד אנחנו רוצים שהמשתמש יראה את התקלה. מה עושים? בדיוק בשביל זה יש Exceptions!

דרך השימוש היא פשוטה ביותר – שימו לב!


<?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}

inverse(0);

מה יקרה אם אני אריץ את הקוד הזה? ברגע שתתרחש התקלה ה-Exception יקפיץ fatal error וירשום את ההודעה שהגדרנו לו:

תקלת PHP שנובעת מ-Exception
תקלת PHP שנובעת מ-Exception

'רגע אחד!' חלק מכם בטח אומרים 'מה זה fatal error??? אז בשביל מה אני צריך את זה בכלל???' בדיוק בשביל זה יש את ה-try catch! אם אני מכניס את זה לתוך try-catch, אז אין לי fatal error אלא משהו אחר לגמרי – הנה דוגמה!


< ?php
function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}

try {
    echo inverse(0) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
}

התוצאה המתקבלת:
Caught exception: Division by zero.

נחמד, לא?
במאמר על try-catch הזהרתי לא להשתמש במבנה הזה בלי הכרה, אפשר להנות מיתרונות ה-Excpetion בלי fatal error ובלי try-catch. איך עושים את זה? באמצעות הכרזה על פונקציה שמטפלת ב-exceptions ובכל פעם שנזרוק exception הפונקציה הזו תרוץ. למשל:


<?php
function customException($e) {
	echo 'Caught exception: ',  $e->getMessage(), "\n";
}
set_exception_handler('customException');

function inverse($x) {
    if (!$x) {
        throw new Exception('Division by zero.');
    }
    else return 1/$x;
}

 echo inverse(0);

יש עוד לא מעט בנושא Exceptions, אלו מכם שמתכנתים בגישה מונחית עצמים, ישמחו לדעת שיש class שלם של exceptions שאפשר לרשת ממנו ולעשות איתו דברים מופלאים – כמו להגדיר סוגים שונים של Exceptions – אבל זהו הבסיס. אם לא השתמשתם עד כה ב-exceptions, כדאי לחשוב איך להשתמש בו וליצור סקריפטים יציבים וחזקים יותר.

כדאי תמיד להשאר מעודכנים! אם יש לכם טלגרם, בדקו את ערוץ הטלגרם של האתר שבו אני מעדכן על פוסטים חדשים 🙂 אם אתם רוצים ללמוד תכנות באופן מקיף ומסודר, הצטרפו לאלפי הלומדים בפרויקט "ללמוד ג'אווהסקריפט בעברית" שמלמד לתכנת בג'אווהסקריפט, ב-Node.js ובריאקט וגם מלמד על תרומה לקוד פתוח. גם ספרים דיגיטליים וגם ספרים מודפסים. בשיתוף הקריה האקדמית אונו ובתמיכת חברות מובילות כגון Wix, Outbrain, Elementor, Iron Source, Chegg, Really Good ועוד.
PHP

השארת תגובה

ביטול

ללמוד ג'אווהסקריפט בעברית

ללמוד לתכנת ג'אווהסקריפט בעברית שגייס יותר משלוש מאות אלף שקל ולמעלה מ-2000 תומכים - בואו ללמוד עכשיו איך לתכנת.

רשימת הנושאים
  • מדריכים
    • ריאקט
    • טייפסקריפט
    • ECMAScript 6
    • ES20XX
    • Node.js
    • Express
    • רספברי פיי
    • Babel
    • docker
    • MongoDB
    • Git
    • לימוד MySQL
    • SASS
    • jQuery
    • CSS3
    • HTML 5
    • SVN
    • LESS
  • פיתוח אינטרנט
    • פתרונות ומאמרים על פיתוח אינטרנט
    • jQuery Scripts
    • jQuery למתקדמים
    • יסודות בתכנות
    • נגישות אינטרנט
  • חדשות אינטרנט
  • מידע כללי על אינטרנט
    • רשת האינטרנט
    • בניית אתרי אינטרנט
  • rss logo

    לכל המאמרים

    לכל המאמרים שפורסמו באינטרנט ישראל משנת 2008 ועד עכשיו.
  • rss logo

    RSS Feed

    משתמשים בקורא RSS? אם כן, עקבו אחרי אינטרנט ישראל באמצעות פיד ה-RSS!
    מה זה RSS?
  • Twitter logo

    עקבו אחרי בטוויטר

    בחשבון הטוויטר שלי אני מפרסם עדכונים מהירים על חדשות בתחום התכנות והיזמות, התרעות על מצבי חירום ורכילות בוערת על תחום הווב.
    מה זה טוויטר?
  • facebook like image

    ערוץ הטלגרם של אינטרנט ישראל

    בערוץ הטלגרם של אינטרנט ישראל אני מפרסם את הפוסטים של באתר וכן עדכונים טכנולוגיים נוספים.
    מה זה טלגרם?
  • github logo

    הפרויקטים שלי בגיטהאב

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

כל הזכויות שמורות לרן בר-זיק ולאינטרנט ישראל | מדיניות הפרטיות של אתר אינטרנט ישראל | אתר אינטרנט ישראל נגיש לפי תקן WCAG 2.0 AA | הצהרת הנגישות של האתר | אבטחת מידע ודיווח על בעיית אבטחת מידע

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