האתר הישראלי להנדסת תכנה

דף ראשי | מפת האתר | רשימת מושגים | מקורות נוספים | אודות
סבולת לתקלות גילוי תקלות

טיפול בחריגות

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

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

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

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

סבולת לתקלות לתחילת הדף גילוי תקלות
©איתן 2003. כל הזכויות שמורות למערכת המידע איתן