מצאתי כשאני קורא את הקובץ של המשתמשים יש שורה עם משתמש שגוי (ערך חסר)
בניתי את הפונקציה באופן כזה שהיא מרימה שגיאה, אבל למעשה באופן כזה אף פעם לא יצליח לי לקרוא את הקובץ ולכן לא אוכל לפענח את המסר.
אני מבין שאני צריך לבצע את הפעולה אחרת השאלה מהי הגישה הנכונה?
אני יכול כמובן להכין קובץ לוג שכאשר אני עומד בתנאי של השגיאה אז אני רושם את השורה ואת השגיאה בקובץ כזה.
השאלה אם זו הגישה הנכונה או שיש משהו אחר שניתן לעשות שהוא קצת יותר מעודן.
ofirp
שים לב שרישום לקובץ לוג נועד עבור מתכנתים שאתה חולק איתם את הקוד, לא משהו שקשור למשתמש. הרעיון כאן להבנתי הוא לנהל את השגיאה כך שהקוד ידע לדלג על השורה השגויה ולהמשיך לקרוא את הקובץ למרות השגיאה.
לייק 1
yosefco3
אני לא נתקלתי בזה , אבל אם הייתי נתקל הייתי שם ערך None במקום החסר
aviadamar
בפונקציה load_file - בהנחחה ונגיד מגיעים לשורת מידע שלא מכילה את הנתונים הרצויים.
האם נכון יותר להרים התראה כדי שהמתכנת ידע שיש שם שורה לא תיקנית (ובכך גם להפסיק את הריצה) , או לגרום לפנקציה “לדלג” על השורות האלה אולי רק לעשות print ?
Yam
מרשה לעצמי לענות כיוון שזה יותר קשור למנהגים נכונים מאשר לפתרון –
לדעתי נכון בפונקציה פנימית להרים שגיאה, ובפונקציה שמשתמשת בה לתפוס אותה ולהמשיך הלאה
לייק 1
aviadamar
תתקן אותי אם אני טועה אבל אם אני עושה raise התכנית מפסיקה, אז אם אני מרים שגיאה בפונקציה הפנימית בכל מקרה התכנית תעצורה ולא תמשיך הלאה לא ? :\
orronai
הפונקציה הפנימית תעלה לך שגיאה (את ה-raise שיצרת).
אבל תזכור שיש את ה-Traceback.
אתה תחזור לפונקציה החיצונית עם השגיאה.
תוכל לתפוס את השגיאה שם
aviadamar
אה נכון נכון !! אוקי תודה לשניכם
Dusinka
תקוע באותו מקום, בכל איטרציה על השורות אני בודק אם כמות האיברים היא ככמות הכותרות. הוספתי עכשיו זריקת שגיאה כשמזוהה שורה עם כמות שונה של איברים, אבל מה שקורה זה שכל יצירת הusers נעצרת ברגע קפיצת השגיאה
aviadamar
אתה צריך לטפל בזה גם בחוץ ואז זה יתפוס אותה (:
Dusinka
טיפלתי, בכל זאת כנראה שאיכשהו זה עוצר את הריצה. כנראה בגלל שאני מריץ את הפונקציה שזורקת שגיאה כחלק מlist comprehension שנמצא בreturn שלי וגורם לו להחזיר None
aviadamar
יש לשים לב ששימוש בraise למשל זורק שגיאה ואם אין בחוץ פונקציה שתופסת אותו הוא מפיל את הקוד
mbrodsky
האם חובה לטפל בכל שגיאה, גם כזו שבעצם לא תתרחש בהתאם לתנאי התרגיל? אני שואל כי בקוד שלי השורה שבה חסר המידע יוצרת מילון שנכנס לרשימת המילונים כמו כל רשימה אחרת, ואין שום בעיה עם זה. כלומר, הבעיה היחידה שיכולה לצוץ זה אם המתכנת/משתמש ינסה לגשת ספציפית למילון הזה ולהשתמש בו לצורך פענוח (תסריט לא הגיוני בעליל). המילון הפגום הזה סתם יושב לו בתוך רשימת המילונים בלי להזיק לאף אחד. אני יכול לדמיין מצב שבו מישהו ירצה לעבור על כל אחד מהמילונים בלולאה כדי לחלץ מהם מידע ואם הוא מניח שכולם תקינים אז תיווצר שגיאה, אבל זה לא משהו שאמור לקרות בתרגיל. אני יכול גם כמובן לכתוב קוד שינקה את המילון ובגדול נראה שזו הפרקטיקה העדיפה - לנקות את הדאטה מראש במקום ליצור שגיאה שמישהו אחר צריך להתמודד איתה. אני יודע שכבר דנו בפרקטיקה במעלה השרשור, אבל זו נראית כמו פרקטיקה עדיפה גם מבחינה התוצר הסופי וגם מבחינת זה שעדיף לתקן שגיאות מראש מאשר להקפיץ אותן.
לייק 1
Yam
זה נשמע שזה בדיוק המקום בו צריכה להיות חריגה, כדי להתריע בפני המתכנת שמשהו בנתונים לא תקין
לייק 1
Dusinka
כשאתה אומר זה בדיוק המקום, הכוונה במהלך יצירת רשימת המילונים או במהלך פנייה למילון משובש?
mbrodsky
אני חושב שהכוונה היא בזמן יצירת המילון המשובש, כי זה הרגע שבו יתגלה שמשהו פגום בדאטה, ועדיף להתריע על כך ברגע שזה מתגלה.
Yam
הטריק הוא לחשוב על עצמכם בתור המתכנת ובתור המשתמש.
עבור ממשקים פנימיים שקשורים למתכנת, שואלים:
מה הייתם רוצים שיקריס את התוכנית ולא יתן לכם להמשיך לתכנת?
מה הייתם רוצים שיתריע “זה תקול” וימשיך הלאה?
עבור ממשקים שמונגשים כלפי המשתמש, שואלים:
מה החוויה שהייתי רוצה שתהיה לי ברגע שאני משתמש בתוכנה?
איך אני מטפל במצב של התוכנה, או אם ממש חייב – איך אני מפסיק את הפעולה שלה בצורה נעימה ומודיע על זה למשתמש?
2 לייקים
shirabarel
איך יכול להיות שלא נתקלתי בזה??
mbrodsky
בהגדרות של מה שהתרגיל מבקש לעשות השורה הזו לא גורמת לשגיאה. כשפותחים את הקובץ עם שמות המשתמשים ניתן לראות שיש שורה עם מידע חסר. ברוב הדרכים שבהם מחלצים את המידע בקובץ לתוך מילון כמו שהתרגיל מבקש זה לא יגרום לשום שגיאה, ומאחר ואף אחד לא מבקש מאיתנו לפנות לשורה הזו אז זה לא מקפיץ שום חריגה. אם מדפיסים את התוצאה של הפיכה למילון כחלק מהדיבגינג אז אפשר לראות את השורה הזו די בקלות. מה צריך לעשות איתה נידון פה בכמה דרכים במעלה השרשור.