C++/חריגות: הבדלים בין גרסאות בדף

תוכן שנמחק תוכן שנוסף
Skman (שיחה | תרומות)
מ ←‏הקדמה: הוספת פירוט
Skman (שיחה | תרומות)
הוספת חלק - מי יכול לזרוק
שורה 1:
{{C++C}}
== חריגות ב C++C ==
=== הקדמה ===
חריגות ( exceptions באנגלית ) הן המגנון ב ++C שמאפשר לטפל בשגיאות או בחריגות מהתכנון המקורי(מכאן נובע השם) של המתכנת.
שורה 18:
כל אחת משכבות יכולה "לזרוק" שגיאה ( או במילים אחרות להתריע - "שימו לב, משהו לא תקין" ) והשגיאה תעבור דרך כל השכבות מהמעבד ועד לקוד המשתמש עד שאחד המנגנונים "יתפוס" אותה ויטפל בשגיאה.
 
חריגות, הן לא דבר רע. להיפך - הן הדרך שלנו להתגונן בפני דברים רעים שעלולים לקרות.,
=== מי יכול "לזרוק"? ===
כל קוד שרץ יכול להתריע על שגיאות. לכל שכבה יש את סט הבדיקות שלה וכל חריגה שמתגלה, תגרור "זריקה".
למשל, אחד התפקידים של מערכת ההפעלה הוא ניהול הזיכרון שיש לה ( החומרה שעליה היא רצה ) וחלוקה שלו בין התהליכים השונים שרצים. את הזיכרון הזה היא מחלקת למספר סוגים:
* זיכרון שאפשר לקרוא ממנו.
* זיכרון שאפשר לכתוב אליו.
* זיכרון שאפשר להריץ ממנו קוד.
אם יש ניסיון לעשות משהו שאסור לעשות על קטע זיכרון מסויים, מערכת ההפעלה תתריע ו"תזרוק" שגיאה. נקרא לה בינתיים Access]] Violation]].
 
דוגמא נוספת תהיה, שגיאה שנזרקת מתוך קוד המשתמש:
כשהמכנת כותב קוד, הוא קובע ( בתקווה ) מראש מה התוכנית אמורה לעשות. הוא מחליט מה הן דרישות המערכת ומה היא אמורה לעשות. מתוך הדרישות האלו, ניתן לקבוע מה התוכנית לא אמורה לעשות. אם אנחנו מגיעים למשהו שאנחנו מזהים כמשהו שלא אמור לקרות אנחנו יכולים להודיע לשאר התוכנית של המשתמש שקרה משהו לא צפוי ע"י זריקת חריגה משלנו.
השאלה המתבקשת כמובן היא - למה אני צריך לזרוק אם אני זורק את זה מתוך קוד משתמש וזה מגיע שוב לקוד משתמש? אז מערכות גדולות ובטח ב[[תכנות מונחה עצמים]] כמו ב ++C אנחנו מפרידים בין מודולים שונים של התוכנית. כלומר, אנחנו נותנים אחריות שונה לכל אחד מהמודולים וכל אחד מהם "חי" בכוחות עצמו. למשל, אם אני רוצה לכתוב שרת שמקבל בקשות מקליינטים שונים ונותן להם שירותים, אני אחלק את זה לשני מודולים שונים - מודול שאחראי על השרת ומודול שאחראי על הקליינט. המודולים הללו יודיעו אחד לשני על חריגות מהצפוי בדיוק באופן הזה.
==== שפות אחרות ====
חריגות הן לא משהו ייחודי לשפת ++C וגם בשפות אחרות יש שימוש במנגנון זה. למשל - כך היינו עושים את זה בשפת C. נניח שאנו ממשים את הפונקציה sqrt המחזירה שורש של מספר. חתימת הפונקציה:
<source lang="cpp">