טיפול בשגיאות
הערה
ההתנהגות המתוארת במאמר זה זמינה רק כאשר תכונת התצוגה המקדימה ניהול שגיאות ברמת הנוסחה תחת הגדרות>תכונות עתידיות> מופעלת בתצוגה מקדימהew. למידע נוסף: קביעת אילו תכונות מופעלות
שגיאות קורות. הרשתות יורדות, האחסון מתמלא, ערכים בלתי צפויים זורמים פנימה. חשוב שתמשיך לחשוב בהיגיון לנוכח בעיות פוטנציאליות.
כברירת מחדל, שגיאות זורמות דרך נוסחאות של אפליקציה ומדווחות למשתמש הקצה של האפליקציה. בדרך זו, משתמש הקצה יודע שקרה משהו בלתי צפוי, הוא יכול לתקן את הבעיה בעצמו באמצעות קלט אחר, או שהוא יכול לדווח על הבעיה לבעל האפליקציה.
כיוצר אפליקציות, אתה יכול להשתלט על שגיאות באפליקציה שלך:
- זיהוי שגיאה וטיפול בה. אם יש סיכוי שתתרחש שגיאה, אפשר לכתוב את הנוסחאות של האפליקציה כדי לזהות את מצב השגיאה ולנסות שוב את הפעולה. משתמש הקצה לא צריך לחשוש מכך שהתרחשה שגיאה כי היוצר הביא את האפשרות בחשבון. זה נעשה עם פונקציות IfError, IsError, ו-IsErrorOrBlank בתוך נוסחה.
- דיווח שגיאה. אם לא מטפלים בשגיאה בנוסחה שבה היא התגלתה, השגיאה תועבר למטפל ב-App.OnError. כאן, אי אפשר עוד להחליף את השגיאה מכיוון שהיא כבר התרחשה והיא חלק מחישובי נוסחה. אבל אפשר להשתמש ב-App.OnError כדי לשלוט באופן שבו השגיאה מדווחת למשתמש הקצה, כולל עצירת דיווח השגיאות כולו. App.OnError מספק גם נקודת חנק נפוצה לדיווח על שגיאות בכל האפליקציה.
- יצירה והצגה מחדש של שגיאה. לבסוף, ייתכן שתזהה מצב שגיאה עם ההיגיון שלך, מצב ספציפי לאפליקציה שלך. השתמש בפונקציה שגיאה כדי ליצור שגיאות מותאמות אישית. פונקציית שגיאה משמשת גם להצגה מחדש של שגיאה אחרי בדיקתה ב-IfError או App.OnError.
תחילת העבודה
נתחיל בדוגמה פשוטה.
- צור מסך חדש באפליקציית בד ציור של Power Apps.
- הוסף פקד TextInput. ברירת המחדל היא השם TextInput1.
- הוסף פקד תווית.
- הגדר את המאפיין טקסט של הפקד תווית לנוסחה
1/Value( TextInput1.Text )
קיבלנו שגיאה מכיוון שטקסט ברירת המחדל של פקד TextInput הוא "Text input"
, שאי אפשר להמיר למספר. כברירת מחדל זה דבר טוב: משתמש הקצה יקבל הודעה שמשהו לא עובד כמצופה באפליקציה.
ברור שאנחנו לא רוצים שהמשתמש ייתקל בשגיאה בכל פעם שהוא מפעיל את האפליקציה הזו. סביר להניח ש-"Text input"
אינה ברירת המחדל הנכונה עבור תיבת קלט הטקסט בכל מקרה. כדי לתקן את המצב, בואו נחליף את המאפיין ברירת מחדל של פקד TextInput עם:
Blank()
הממ, עכשיו יש לנו שגיאה אחרת. פעולות מתמטיות עם ריק, כגון חלוקה, יכפו את הערך הריק לאפס. וכעת זה גורם לחלוקה בשגיאה אפס. כדי לתקן זאת, עלינו להחליט מהי ההתנהגות המתאימה למצב זה באפליקציה זו. ייתכן שהתשובה היא להציג ריק כאשר קלט הטקסט הוא ריק. נוכל להשיג זאת על ידי גלישת הנוסחה שלנו עם הפונקציה IfError:
IfError( 1/Value( TextInput1.Text ), Blank() )
כעת השגיאה מוחלפת בערך חוקי וכרזת השגיאה נעלמת. אבל אולי חרגנו, ה-IfError שהשתמשנו בו מכסה את כל השגיאות, כולל הקלדת ערך גרוע כגון "hello"
. נוכל לטפל בזה על ידי כוונון IfError לטפל בחלוקה באפס רק עם הצגה מחדש של כל השגיאות האחרות:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
אז בואו נריץ את האפליקציה שלנו וננסה כמה ערכים שונים.
ללא ערך כלשהו, כמו בעת הפעלת האפליקציה, לא מוצגת תשובה שכן ערך ברירת המחדל הוא ריק, אך גם אין שגיאה מוצגת משום ש-IfError מחליף את החלוקה בשגיאת אפס.
אם נקליד 4, נקבל את התוצאה הצפויה של 0.25:
אם נקליד משהו לא חוקי, כמו hello
, נקבל כרזת שגיאה:
זוהי דוגמת מבוא פשוטה. טיפול בשגיאות יכול להתבצע בדרכים רבות ושונות, בהתאם לצרכי האפליקציה:
- במקום כרזת שגיאה, יכולנו להציג את "#Error" בפקד התווית עם הנוסחה. כדי לשמור על התאמה של סוגי ההחלפות עם הארגומנט הראשון ל-IfError עלינו להמיר במפורש את התוצאה המספרית למחרוזת טקסט עם פונקציית טקסט.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- במקום לעטוף את המופע הספציפי הזה ב-IfError היינו יכולים לכתוב מטפל App.OnError מרכזי. אנחנו לא יכולים להחליף את המחרוזת המוצגת ב-"#Error" מכיוון שהשגיאה כבר התרחשה ו-App.OnError ניתן רק כדי לשלוט בדיווח.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
הפצת שגיאה
שגיאות זורמות בנוסחאות כפי שקורה ב-Excel. לדוגמה, ב-Excel, אם לתא A1
יש את הנוסחה =1/0
, אז A1 יציג את ערך השגיאה #DIV0!
:
אם התא A2
מתייחס ל-A1
עם נוסחה כגון =A1*2
, השגיאה מתפשטת גם דרך אותה נוסחה:
השגיאה מחליפה את הערך שאחרת היה מחושב. אין תוצאה עבור הכפל בתא A2
, רק השגיאה מהחלוקה ב-A1
.
Power Fx פועל באותה צורה. באופן כללי, אם שגיאה מסופקת כארגומנט לפונקציה או לאופרטור, הפעולה לא תתבצע ושגיאת הקלט תזרום כתוצאה מהפעולה. לדוגמה, Mid( Text( 1/0 ), 1, 1 )
יחזיר שגיאת חלוקה באפס, מכיוון שהשגיאה הפנימית ביותר עוברת דרך הפונקציה טקסט ופונקציית Mid:
באופן כללי, שגיאות לא זורמות דרך מאפייני פקד של Power Apps. הבה נרחיב את הדוגמה הקודמת עם פקד נוסף שמציג אם מאפיין ה-Text
של התווית הראשונה הוא מצב שגיאה:
זה בסדר ששגיאות לא מתפשטות דרך פקד כי המערכת תצפה בשגיאות בקלט לכל מאפייני הפקד. השגיאה לא תאבד.
רוב הפונקציות והאופרטורים עוקבים אחר הכלל "שגיאה נכנסת, שגיאה יוצאת", אבל יש כמה חריגים. הפונקציות IsError, IsErrorOrBlank ו-IfError מיועדות לעבודה עם שגיאות כך שהן עלולות שלא להחזיר שגיאה גם אם השגיאה מועברת אליהן.
צפייה בשגיאות
שגיאות לא נצפות עד שנעשה שימוש בערכן.
כתוצאה מכך, ייתכן שגם הפונקציות If ו-בחר לא יחזירו שגיאה אם היא תועבר. שקול שימוש בנוסחה If( false, 1/0, 3 )
. יש שגיאת חלוקה באפס בנוסחה זו, אבל מכיוון ש-If
לא בוחר בענף הזה בגלל false
, Power Fx ו-Power Apps לא ידווח על שגיאה:
שימוש בפונקציה הגדרה עם שגיאה לא ידווח על שגיאה בנקודה שבה השגיאה ממוקמת במשתנה. לדוגמה ב-Power Apps, הנה נוסחה ב-App.OnStart הממקמת חלוקה באפס שגיאה למשתנה x
:
לא דווח על שגיאה, כי אין הפניה ל-x
. עם זאת, ברגע שאנו מוסיפים פקד תווית ומגדירים את מאפיין הטקסט שלו ל-x
, השגיאה מוצגת:
אפשר לצפות בשגיאות בתוך נוסחה עם פונקציות IfError, IsError, ו-IsErrorOrBlank. עם פונקציות אלה, אפשר להחזיר ערך חלופי, לנקוט פעולה חלופית או לשנות את השגיאה לפני שהיא נצפית ומדווחת.
דיווח שגיאות
לאחר שנצפתה שגיאה, השלב הבא הוא לדווח על השגיאה למשתמש הקצה.
שלא כמו Excel, לא תמיד יש מקום נוח להציג תוצאת שגיאה, מכיוון שתוצאת נוסחה עלולה להניע מאפיין כגון קואורדינטות X ו-Y של פקד שעבורו אין מקום נוח להציג טקסט כלשהו. כל מארח של Power Fx שולט באופן שבו שגיאות מוצגות בסופו של דבר למשתמש הקצה ומה השליטה של היוצר בתהליך זה. ב-Power Apps מוצגת כרזת שגיאה ו-App.OnError משמשת לשליטה על אופן הדיווח על השגיאה.
חשוב לציין ש-App.OnError לא יכולה להחליף את השגיאה באותו אופן כמו IfError. בשלב ש-OnError מתבצעת, השגיאה כבר התרחשה והתוצאה מופצת בנוסחאות אחרות. App.OnError שולט רק על אופן הדיווח על השגיאה למשתמש הקצה ומספק חיבור ליצרן לרשום את השגיאה אם תרצה בכך.
משתני הטווח FirstError ו-AllErrors מספקים מידע הקשר לגבי השגיאה או השגיאות. הדבר מספק מידע על סוג השגיאה והיכן נוצרה השגיאה והיכן היא נצפתה.
עצירה לאחר שגיאה
נוסחאות התנהגות תומכות בפעולה, שינוי מסדי נתונים ושינוי מצב. נוסחאות אלה מאפשרות לבצע יותר מפעולה אחת ברצף באמצעות אופרטור השרשור ;
(או ;;
בהתאם לאזור).
במקרה זה, למשל, פקד הרשת מראה מה יש בטבלה T
. כל בחירה בלחצן משנה את המצב בטבלה זו עם שתי שיחות תיקון:
בנוסחת התנהגות משורשרת, הפעולות לא מפסיקות לאחר השגיאה הראשונה. בואו נשנה את הדוגמה שלנו כדי להעביר מספר אינדקס לא חוקי בשיחת התיקון הראשונה. התיקון השני ממשיך למרות השגיאה הקודמת. השגיאה הראשונה מדווחת למשתמש הקצה ומוצגת כשגיאה בסטודיו בפקד:
ניתן להשתמש ב-IfError כדי לעצור את הביצוע לאחר שגיאה. בדומה לפונקציה If, הארגומנט השלישי לפונקציה זו מספק מקום לביצוע פעולות שאמורות להתבצע רק אם אין שגיאה:
אם נתקלת בשגיאה במהלך אחת החזרות של ForAll, שאר החזרות לא ייפסקו. ForAll נועד לבצע כל איטרציה באופן עצמאי, מה שמאפשר ביצוע מקביל. כאשר ה-ForAll הושלם, תוחזר שגיאה המכילה את כל השגיאות שנתקלו (על ידי בדיקת AllErrors ב-IfError או App.OnError).
לדוגמה, הנוסחה הבאה תביא ל-ForAll החזרת שתי שגיאות (עבור החלוקה באפס עבור Value
של 0, פעמיים) ו-Collection
יהיו שלוש רשומות (כאשר Value
לא 0): [1, 2, 3]
.
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
עבודה עם כמה שגיאות
מכיוון שנוסחת התנהגות יכולה לבצע יותר מפעולה אחת, היא גם יכולה להיתקל ביותר משגיאה אחת.
כברירת מחדל, השגיאה הראשונה מדווחת למשתמש הקצה. בדוגמה זו, שתי השיחות Patch ייכשלו, השנייה עם חלוקה בשגיאה באפס. רק השגיאה הראשונה (על אינדקס) מוצגת למשתמש:
הפונקציות IfError ו-App.OnError יכולות לגשת לכל השגיאות שנתקלו במשתנה הטווח AllErrors. במקרה זה, נוכל להגדיר זאת למשתנה גלובלי ולבחון את שתי השגיאות שנתקל בהן. הן מופיעות בטבלה באותו סדר שבו נתקלנו בהן.
אפשר להחזיר שגיאות מרובות גם בנוסחאות שאינן התנהגותיות. לדוגמה, שימוש בפונקציה תיקון עם אצווה של רשומות לעדכון יכול להחזיר שגיאות מרובות, אחת לכל רשומה שנכשלת.
שגיאות בטבלאות
כפי שראינו קודם, ניתן לאחסן שגיאות במשתנים. ניתן לכלול שגיאות גם במבני נתונים, כגון טבלאות. זה חשוב כדי ששגיאה ברשומה אחת לא יכולה לבטל את הטבלה כולה.
לדוגמה, שקול את פקד טבלת הנתונים הזה ב-Power Apps:
החישוב ב-AddColumns נתקל בחלוקה בשגיאה באפס עבור אחד הערכים. עבור הרשומה האחת הזו, העמודה Reciprocal יש ערך שגיאה (חלוקה באפס) אבל לשאר הרשומות אין והן בסדר. IsError( Index( output, 2 ) )
מחזירה false ו IsError( Index( output, 2 ).Value )
מחזירה true.
אם מתרחשת שגיאה בעת סינון טבלה, הרשומה כולה היא שגיאה אך עדיין מוחזרת בתוצאה כך שמשתמש הקצה יודע שהיה שם משהו ויש בעיה.
למשל, דוגמה זו. כאן, בטבלה המקורית אין שגיאות, אבל פעולת הסינון יוצרת שגיאה בכל פעם שערך שווה ל-0:
הערכים 5- ו-3- מסוננים כראוי. הערכים 0 מביאים לשגיאה בעיבוד המסנן, ולכן לא ברור אם הרשומה צריכה להיכלל או לא בתוצאה. כדי למקסם את השקיפות עבור משתמשי הקצה ולעזור ליוצרים לבצע איתור באגים, אנו כוללים רשומת שגיאה במקום המקור. במקרה זה, IsError( Index( output, 2 ) )
מחזיר אמת.
שגיאות מקור נתונים
הפונקציות שמשנות נתונים במקורות נתונים, כגון תיקון, איסוף, הסרה, RemoveIf, עדכון, UpdateIf, ו-SubmitForm דיווחו על שגיאות בשתי דרכים:
- כל אחת מהפונקציות הללו תחזיר ערך שגיאה כתוצאה מהפעולה. אפשר לזהות שגיאות ב-IsError ולהחליף או להעלים ב-IfError וב-App.OnError כרגיל.
- לאחר הפעולה, הפונקציה שגיאות תחזיר גם את השגיאות עבור פעולות קודמות. זה יכול להיות שימושי להצגת הודעת השגיאה במסך טופס ללא צורך ללכוד את השגיאה במשתנה מצב.
לדוגמה, נוסחה זו תבדוק אם יש שגיאה מאיסוף ותציג הודעת שגיאה מותאמת אישית:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
הפונקציה שגיאות מחזירה גם מידע על שגיאות קודמות במהלך פעולות זמן ריצה. זה יכול להיות שימושי להצגת הודעת השגיאה במסך טופס ללא צורך ללכוד את השגיאה במשתנה מצב.
הצגה מחדש של שגיאות
לפעמים צפויות שגיאות פוטנציאליות ואפשר להתעלם מהן בבטחה. בתוך IfError ו-App.OnError, אם זוהתה שגיאה שאמורה לעבור למטפל הגבוה הבא, אפשר להציג אותה מחדש עם Error( AllErrors )
.
יצירת השגיאות שלך
אפשר גם ליצור שגיאות משלך עם הפונקציה שגיאה .
אם אתה יוצר שגיאות משלך, מומלץ להשתמש בערכים מעל 1000 כדי למנוע התנגשויות פוטנציאליות עם ערכי שגיאות מערכת עתידיות.
ערכי ספירת ErrorKind
ספירת ErrorKind | ערך | תיאור |
---|---|---|
AnalysisError | 18 | שגיאת מערכת. אירעה בעיה עם המהדר. |
BadLanguageCode | 14 | נעשה שימוש בקוד שפה לא חוקי או לא מזוהה. |
BadRegex | 15 | ביטוי רגיל לא חוקי. בדוק את התחביר בשימוש עם פונקציות IsMatch, התאמה, או MatchAll. |
התנגשות | 6 | הרשומה המתעדכנת כבר שונתה במקור ויש לפתור את ההתנגשות. פתרון נפוץ הוא לשמור את כל השינויים המקומיים, לרענן את הרשומה ולהחיל מחדש את השינויים. |
ConstraintViolated | 8 | הרשומה לא עברה בדיקת אילוצים בשרת. |
CreatePermission | 3 | למשתמש אין הרשאה ליצור רשומות עבור מקור נתונים זה. לדוגמה, נקראה הפונקציה איסוף . |
DeletePermissions | 5 | למשתמש אין הרשאה למחוק רשומות עבור מקור נתונים זה. לדוגמה, נקראה הפונקציה הסרה . |
Div0 | 13 | חלוקה באפס. |
EditPermissions | 4 | למשתמש אין הרשאה ליצור רשומות עבור מקור נתונים זה. לדוגמה, נקראה הפונקציה תיקון . |
GeneratedValue | 9 | ערך הועבר בטעות לשרת עבור שדה שמחושב אוטומטית על ידי השרת. |
InvalidFunctionUsage | 16 | שימוש לא חוקי בפונקציה. לעתים קרובות אחד הארגומנטים לפונקציה או יותר אינם נכונים או משמשים בצורה לא חוקית. |
FileNotFound | 17 | אי אפשר היה למצוא את אחסון SaveData. |
InsufficientMemory | 21 | אין מספיק זיכרון או אחסון במכשיר עבור הפעולה. |
InvalidArgument | 25 | ארגומנט לא חוקי הועבר לפונקציה. |
פנימי | 26 | שגיאת מערכת. הייתה בעיה פנימית באחת הפונקציות. |
MissingRequired | 2 | חסר שדה חובה ברשומה. |
רשת | 23 | אירעה בעיה בתקשורת הרשת. |
ללא | 0 | שגיאת מערכת. אין שגיאה. |
לא ישים | 27 | אין ערכים זמינים. שימושי להבדיל בין ערך ריק שאפשר להתייחס אליו כאל אפס בחישובים מספריים לבין ערכים ריקים שיש לסמן כבעיה פוטנציאלית אם נעשה שימוש בערך. |
NotFound | 7 | הרשומה לא נמצאה. לדוגמה, הרשומה שיש לשנות בפונקציה תיקון . |
NotSupported | 20 | הפעולה אינה נתמכת על-ידי נגן או מכשיר זה. |
מספרי | 24 | נעשה שימוש בפונקציה מספרית באופן לא תקין. לדוגמה, Sqrt ב-1. |
QuoteExceeded | 22 | אירעה חריגה ממיכסת האחסון. |
ReadOnlyValue | 10 | העמודה נועדה לקריאה בלבד ולא ניתנת לשינוי. |
ReadPermission | 19 | למשתמש אין הרשאה לקרוא רשומות עבור מקור נתונים זה. |
סנכרן | 1 | מקור הנתונים דיווח על שגיאה. עיין בעמודה Message לקבלת מידע נוסף. |
לא ידוע | 12 | אירעה שגיאה, אך מסוג לא ידוע. |
אימות | 11 | הרשומה לא עברה בדיקת אימות. |