מטפל החריגים העולמי של Java

1. סקירה כללית

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

למידע נוסף על החריגים באופן כללי, עיין בטיפול בחריגים ב- Java.

2. מהו חריג?

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

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

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

כמו כן, אין צורך לטפל בחריגים בזמן הריצה בקוד.

3. מטפלי חריגים

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

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

3.1. ה נסה לתפוס לַחסוֹם

בדוגמה הבאה, לְנַסוֹת החסימה מכילה את הקוד שיכול להוציא חריג. ה לתפוס החסימה מכילה את ההיגיון לטיפול בחריג זה.

ה לתפוס תופס את יוצא מן הכלל התנגד שהקוד ב לְנַסוֹת העלאת חסימות:

מחרוזת מחרוזת = "01,, 2010"; פורמט DateFormat = SimpleDateFormat חדש ("MM, dd, yyyy"); תאריך תאריך; נסה {date = format.parse (מחרוזת); } לתפוס (ParseException e) {System.out.println ("ParseException נתפס!"); }

3.2. ה לזרוק ו זורק מילות מפתח

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

בדרך כלל, שיטת הקריאה מטפלת בחריג במקרים כאלה:

class class ExceptionHandler {main static public void (String [] args) {String strDate = "01,, 2010"; מחרוזת dateFormat = "MM, dd, yyyy"; נסה את {Date date = DateParser new (). getParsedDate (strDate, dateFormat); } לתפוס (ParseException e) {System.out.println ("שיטת הקריאה תפסה את ParseException!"); }}} class DateParser {public Date getParsedDate (String strDate, String dateFormat) זורק ParseException {פורמט DateFormat = חדש SimpleDateFormat (dateFormat); נסה {return format.parse (strDate); } לתפוס (ParseException parseException) {לזרוק parseException; }}}

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

4. מטפל בחריגים גלובליים

המקרים של חריגת זמן ריצה הם אופציונליים לטיפול. כתוצאה מכך, הוא עדיין משאיר חלון פתוח להשגת עקבות הערימה הארוכה בזמן הריצה. כדי להתמודד עם זה, Java מספקת את לא נתפס ExceptionHandler מִמְשָׁק. ה פְּתִיל הכיתה מכילה זאת כמעמד פנימי.

בנוסף לממשק זה, גרסת Java 1.5 גם הציגה שיטה סטטית setDefaultUncaughtExceptionHandler () בתוך ה פְּתִיל מעמד. הטיעון של שיטה זו הוא מחלקת מטפלים המיישמת את ה- לא נתפס ExceptionHandler מִמְשָׁק.

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

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

מחלקה זו מיישמת את השיטה uncaughtException () ומגדיר היגיון לטיפול בחריגים שלא נתפסו בו:

class public GlobalExceptionHandler {public static void main (String [] args) {Handler globalExceptionHandler = New Handler (); Thread.setDefaultUncaughtExceptionHandler (globalExceptionHandler); GlobalExceptionHandler חדש (). performArithmeticOperation (10, 0); } public int performArithmeticOperation (int num1, int num2) {return num1 / num2; }} Class Handler מיישם את Thread.UncaughtExceptionHandler {לוגר סטטי פרטי LOGGER = LoggerFactory.getLogger (Handler.class); חלל ציבורי לא נתפסException (Thread t, Throwable e) {LOGGER.info ("חריג לא מטופל נתפס!"); }}

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

כנ"ל לגבי חריגים מסומנים שלא טופלו. בואו נראה דוגמה מהירה לכך גם:

ראשי ריק סטטי ציבורי (String [] args) זורק Exception {Handler globalExceptionHandler = New Handler (); Thread.setDefaultUncaughtExceptionHandler (globalExceptionHandler); קובץ נתיב = Paths.get (""); Files.delete (קובץ); }

הנה ה Files.delete () שיטה זורקת בדק IOException, אשר נזרק עוד יותר על ידי רָאשִׁי() חתימת שיטה. ה מטפל יתפוס גם את החריג הזה.

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

5. מסקנה

במאמר זה לקחנו זמן להבין מהם היוצאים מן הכלל ומהן הדרכים הבסיסיות להתמודד איתם. כמו כן, זיהינו שמטפל החריגים הגלובלי הוא חלק מה- פְּתִיל בכיתה והיא מטפלת בחריגים שלא נתפסו בזמן הריצה.

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

את קודי הדוגמה של מאמר זה ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found