שאלה כללית לגבי Exeptions

גרי רשף

New member
שאלה כללית לגבי Exeptions

האם יש למישהו הצעה כללית כיצד לערוך מודולים הכוללים טיפול Try & Catch ב-Exeptions (שגרות השגיאה של VB.Net)? אני מתכוון באופן כללי כאשר אין תקלה ספציפית צפויה (כשלון ביצירת Connection, קובץ לא נמצא וכו'). ב-VB6 הייתי כותב כך:
Public Sub.. On Error Goto Err_ (קוד) . . Exit_: Exit Sub Err_: Select Case Err.Number Case Else MsgBox Err.Number & " " & Err.Description End Select Resume Exit_ Resume End Sub​
כרגע אינני נכנס לדיון למה ומה ניתן לשפר במה שעשיתי, אלא מחפש סכימה דומה לטיפול בחריגות ב- VB.Net שאוכל להוסיף אליה בעתיד טיפול בחריגות צפויות (ב-VB6 לשם השוואה הייתי מוסיף Case עם מספר השגיאה ל-Select Case). תודה מראש לכולם ובדיעבד למי שעזר לי עד כה ושנה אזרחית טובה!
 

Admini

New member
שנה אזרחית? אין חיה כזו

אני יודע שראש השנה היה לפני מספר חודשים... בגדול אתה עובד ככה:
Try SomeCode() Catch E as Exeption SomeCode End Try​
בד"כ אני מחזיר למשתמש הודעה דוברת עברית עם תיאור השגיאה (באנגלית) ומספר השגיאה...
 

yuval k

New member
זו הדרך הבסיסית...

ניתן גם לתפוס שגיאה מסוג מסויים בכל בלוק, כך -
Try ' Do something Catch E as
System.IO.IOException​
' Handle IOException Catch E as
System.Exception​
' Handle any other exceptions that may rise End Try​
 

Afik17

New member
../images/Emo41.gif אני אראה לך ! ../images/Emo41.gif

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

Admini

New member
לוג אפשר גם סתם ככה

פשוט להדפיס פרמטרים כמו שורה (במקרה ומדובר ב-WEB), תיאור שגיאה וכו'... אבל לדעתי - כל מקום והטיפול המתאים.
 

gooshi

New member
אפשר להוסיף על זה..

Try ' Do something Catch E as System.IO.IOException ' Handle IOException Catch E as System.Exception ' Handle any other exceptions that may rise Finally 'do something for all the cases above like: myObject.Close() ... End Try​
 

Admini

New member
לא הבנתי למה צריך Finaly

שבימילא אפשר לכתוב שורות קוד אחרי End Try...
 

gooshi

New member
נניח

שאתה מריץ בתוך ה TRY את השורה הבאה:
dataRow = cmd.ExecuteReader;​
כמובן לאחר שפתחת Connection לשם כך. אתה נופל מאיזושהי סיבה וב - Catch אתה רושם הודעה ל Log. אתה עכשיו צריך לשחרר את ה Connection למרות השגיאה. גם אילו היית מצליח ולא נופל היית צריך לעשות זאת. את זה מבצעים ב Finally. אתה בטח שואל למה לא מיד אחרי הקוד? קודם כל זה קוד נקי יותר כי סגירת ה Connection או כל פעולה אחרת שתשים ב Finally אומרת למפתחים שיבואו אחריך שזה חלק מהבלוק שכתוב שם. זאת אומרת שזה לא עוד פקודה או פונקציה שמגיעה אח"כ אלא חלק מלוגיקה שלמה. ה Finally מאפשר לך לוודא שסגרת את הפעולה בכל מקרה, גם בהצלחה וגם בנפילה. יש גם מקרים בהם הקוד שימוקם שם מתנהג בצורות מסויימות בהתאם לשגיאה שהתרחשה או שלא (כמו כתיבות LOG וכדומה) ולכן רצוי שזה יהיה חלק מהבלוק ולא כבלוק IF או SELECT/SWITCH נוסף הנראה מנותק מהעניין.
 
למעלה