إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
يتوفر السلوك الموضح في هذه المقالة فقط عند تشغيل ميزة إدارة الأخطاء على مستوى الصيغة .
يدعم Power Fx معالجة الأخطاء على مستوى الصيغة. يتم تشغيل هذه الميزة بشكل افتراضي لجميع التطبيقات الجديدة. ومع ذلك، قد يتم إيقاف تشغيل بعض التطبيقات القديمة في إعدادات التطبيق. حافظ على تشغيل هذه الميزة.
- افتح تطبيق اللوحة في وضع التحرير.
- انتقل إلى علامة التبويب الإعدادات>التحديثات>المتوقفة .
- تأكد من أن تعطيل الإدارة على مستوى الصيغة غير مفعل.
لمزيد من المعلومات، راجع التحكم في الميزات التي تم تمكينها.
الأخطاء تحدث. الشبكات تتعطل، مساحات التخزين تنفد، قيم غير متوقعة تأتي. من المهم أن يستمر منطقك في العمل بشكل صحيح في مواجهة المشكلات المحتملة.
بشكل افتراضي، تتدفق الأخطاء من خلال صيغ التطبيق كما يتم إعلام المستخدم النهائي للتطبيق بها. بهذه الطريقة، يعرف المستخدم النهائي حدوث شيء غير متوقع. من المحتمل أن يقوموا بإصلاح المشكلة بأنفسهم باستخدام إدخال مختلف، أو يمكنهم إبلاغ مالك التطبيق بالمشكلة.
كصانع تطبيق، تحكم في الأخطاء في تطبيقك:
- الكشف عن خطأ ومعالجته. إذا كانت هناك فرصة لحدوث خطأ، فاكتب صيغ التطبيق للكشف عن حالة الخطأ وأعد محاولة العملية. لا يلزم أن يكون المستخدم النهائي قلقا بشأن حدوث خطأ لأن منشئ التطبيق وضع هذا الاحتمال في الاعتبار. التقط الخطأ باستخدام الدالات IfError و IsError و IsErrorOrBlank داخل صيغة.
- الإبلاغ عن خطأ. إذا لم يتم التعامل مع خطأ في الصيغة التي واجهت فيها الخطأ، فإن الخطأ ينتقل إلى معالج App.OnError. لا يمكنك استبدال الخطأ لأنه حدث بالفعل وهو جزء من حسابات الصيغ. ولكن يمكنك استخدام App.OnError للتحكم في كيفية الإبلاغ عن الخطأ للمستخدم النهائي، بما في ذلك حجب الإبلاغ عن الأخطاء تمامًا. يوفر App.OnError أيضا نقطة اختناق مشتركة للإبلاغ عن الأخطاء عبر التطبيق بأكمله.
- إنشاء خطأ وإعادة ظهوره. وأخيرا، قد تكتشف حالة خطأ بمنطقك الخاص، وهو شرط خاص بتطبيقك. استخدام دالة Error لإنشاء أخطاء مخصصة. استخدم الدالة Error لإعادة ظهور خطأ بعد استجوابه في IfError أو App.OnError.
بدء الاستخدام
لنبدأ بمثال بسيط.
- إنشاء شاشة جديدة في تطبيق Power Apps Canvas.
- قم بإدراج عنصر تحكم TextInput. يتم تعيينه افتراضيا إلى الاسم TextInput1.
- قم بإدراج عنصر تحكم Label.
- قم بتعيين خاصية Text الخاصة بعنصر التحكم Label إلى الصيغة.
1/Value( TextInput1.Text )
ترى خطأ لأن النص الافتراضي لعنصر تحكم TextInput هو "Text input"، والذي لا يمكن تحويله إلى رقم. هذا شيء جيد بشكل افتراضي: يتلقى المستخدم النهائي إعلاما بأن شيئا ما لا يعمل كما هو متوقع في التطبيق.
من الواضح أنك لا تريد ظهور خطأ للترحيب بالمستخدم في كل مرة يبدأ فيها تشغيل هذا التطبيق. من المرجح أن "Text input" ليس الإعداد الافتراضي الصحيح لمربع إدخال النص على أية حال. لإصلاح هذه المشكلة، قم بتغيير الخاصية Default لعنصر تحكم TextInput إلى:
Blank()
Hmm، الآن ترى خطأ مختلفا. العمليات الرياضية مع الفارغة، مثل القسمة، تحول القيمة الفارغة إلى صفر. تتسبب هذه القيمة في حدوث خطأ في القسمة على صفر. لإصلاح هذه المشكلة، تحتاج إلى تحديد السلوك المناسب لهذا الموقف في هذا التطبيق. قد تكون الإجابة هي إظهار فارغ عندما يكون إدخال النص فارغا. يمكنك تحقيق هذا الهدف عن طريق التفاف الصيغة باستخدام الدالة 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، تحتاج إلى تحويل النتيجة الرقمية بشكل صريح إلى سلسلة نصية باستخدام الدالة Text .
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 ) يرجع خطأ القسمة على صفر، حيث يمر الخطأ الأعمق عبر الدالة Text والدالة Mid
بشكل عام، لا تتدفق الأخطاء خلال خصائص عنصر تحكم Power Apps. دعونا نوسع المثال السابق بعنصر تحكم آخر يعرض إذا كانت خاصية التسمية Text الأولى حالة خطأ:
لا بأس من عدم نشر الأخطاء من خلال عنصر تحكم لأن النظام يلاحظ أخطاء في الإدخال لكافة خصائص عنصر التحكم. لم يتم فقدان الخطأ.
تتبع معظم الدوال والمعاملات قاعدة "التوقف وعرض رسالة خطأ"، ولكن هناك بعض الاستثناءات. تم تصميم الدالات IsError و IsErrorOrBlank و IfError للعمل مع الأخطاء، لذلك قد لا ترجع خطأ حتى إذا تم تمرير واحد إليها.
ملاحظة الأخطاء
لا يلاحظ Power Fx الأخطاء حتى تستخدم الصيغة قيمة الخطأ.
ونتيجة لذلك، قد لا ترجع الدالتَين If وSelect خطأ إذا تم تمرير قيمة. فكر في الصيغة If( false, 1/0, 3 ). يوجد خطأ تقسيم على صفر في هذه الصيغة، ولكن بسبب الشرط If فإن الدالة false لا تأخذ هذا الفرع، لذلك لا يقوم Power Fx وPower Apps بالإبلاغ عن خطأ.
لا يؤدي استخدام الدالة Set مع خطأ إلى الإبلاغ عن خطأ عند نقطة وضع الخطأ في المتغير. على سبيل المثال، في Power Apps، إليك صيغة في App.OnStart تضع خطأ القسمة على صفر في المتغير x:
لا يتم الإبلاغ عن خطأ، بسبب عدم الإشارة إلى x. ومع ذلك، في اللحظة التي تقوم فيها بإضافة عنصر تحكم تسمية وتعيين الخاصية Text الخاصة به إلى x، يتم عرض الخطأ:
يمكنك ملاحظة الأخطاء داخل صيغة باستخدام الدالات IfError و IsError و IsErrorOrBlank . باستخدام هذه الدالات، يمكنك إرجاع قيمة بديلة أو اتخاذ إجراء بديل أو تعديل الخطأ قبل ملاحظته وإعداد تقرير عنه.
الإبلاغ عن الأخطاء
بعد أن يلاحظ Power Fx خطأ، فإن الخطوة التالية هي الإبلاغ عن الخطأ إلى المستخدم النهائي.
على عكس Excel، لا يوجد دائما مكان مناسب لإظهار نتيجة الخطأ، حيث قد تؤدي نتيجة الصيغة إلى تشغيل خاصية مثل إحداثيات X وY لعنصر تحكم لا يوجد مكان مناسب لعرض بعض النص له. ويتحكم كل مضيف Power Fx في كيفية عرض الأخطاء في النهاية للمستخدم النهائي وكيفية تحكم المنشئ في هذه العملية. في Power Apps، يتم عرض شعار خطأ، ويتم استخدام App.OnError للتحكم في كيفية الإبلاغ عن الخطأ.
من المهم ملاحظة أن App.OnError لا يمكنه استبدال الخطأ بنفس طريقة IfError. عند النقطة التي يتم فيها تنفيذ App.OnError ، حدث الخطأ بالفعل، ويتم نشر النتيجة من خلال صيغ أخرى. يتحكم App.OnError فقط في كيفية الإبلاغ عن الخطأ للمستخدم النهائي ويوفر خطافا للمنشئ لتسجيل الخطأ إذا رغبت في ذلك.
يوفر متغيرا النطاق FirstError وAllErrors معلومات سياق حول الخطأ أو الأخطاء. يوفر هذا السياق معلومات حول نوع الخطأ ومكان ظهور الخطأ ومكان ملاحظته.
التوقف بعد حدوث خطأ
تدعم صيغ السلوك اتخاذ إجراء وتعديل قواعد البيانات وتغيير الحالة. تسمح هذه الصيغ بتنفيذ أكثر من إجراء واحد في تسلسل باستخدام ; عامل تشغيل التسلسل (أو ;; اعتمادا على الإعدادات المحلية).
في هذه الحالة، على سبيل المثال، يعرض عنصر تحكم الشبكة ما هو موجود في T الجدول. يغير كل زر يتم تحديده الحالة في هذا الجدول عبر عمليتي استدعاء لPatch:
في صيغة سلوك متسلسل، لا تتوقف الإجراءات بعد الخطأ الأول. لنقم بتعديل المثال لتمرير رقم فهرس غير صالح في عملية استدعاء التصحيح الأولى. تستمر التصحيح الثانية على الرغم من هذا الخطأ السابق. يتم إعلام المستخدم النهائي بالخطأ الأول، كما يظهر كخطأ في Studio في عنصر التحكم:
استخدم 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 ) ) );
العمل مع العديد من الأخطاء
نظرا لأن صيغة السلوك يمكن أن تقوم بتنفيذ أكثر من إجراء واحد، فقد تواجه أيضا أكثر من خطأ واحد.
بشكل افتراضي، يبلغ التطبيق عن الخطأ الأول للمستخدم النهائي. في هذا المثال، تفشل استدعاءات التصحيح، ولكن الاستدعاء الثاني يفشل بسبب خطأ القسمة على الصفر. يرى المستخدم الخطأ الأول فقط حول الفهرس:
يمكن للدالة IfErrorوApp.OnError الوصول إلى جميع الأخطاء التي تمت مواجهتها باستخدام متغير نطاق AllErrors . في هذه الحالة، يمكنك تعيين هذا المتغير إلى متغير عمومي والنظر في كلا الخطأين المصادفين. فهي تظهر في الجدول بنفس الترتيب الذي واجهتها به:
يمكن أن ترجع الصيغ غير التصرفية أيضا أخطاء متعددة. على سبيل المثال، قد يتسبب استخدام دالة Patch على دفعة من السجلات للتحديث في أخطاء متعددة، خطأ لكل سجل غير صالح.
الأخطاء في الجداول
كما رأيت سابقا، يمكنك تخزين الأخطاء في المتغيرات. يمكنك أيضا تضمين أخطاء في بنيات البيانات، مثل الجداول. هذا الأسلوب مهم لأنه يضمن أن خطأ في أي سجل واحد لا يمكن أن يبطل الجدول بأكمله.
على سبيل المثال، ضع في اعتبارك عنصر تحكم جدول البيانات هذا في Power Apps:
صادفت العملية الحسابية في AddColumns خطأ القسمة على صفر لإحدى القيم. بالنسبة لهذا السجل الواحد، فإن العمود تبادلي يتضمن قيمة خطأ (القسمة على صفر) ولكن السجلات الأخرى ليست كذلك وهي سجلات صالحة.
IsError( Index( output, 2 ) ) تُرجع false وIsError( Index( output, 2 ).Value ) تُرجع true.
إذا حدث خطأ عند تصفية جدول، يكون السجل بأكمله خطأ. لا تزال العملية ترجع السجل في النتيجة بحيث يعرف المستخدم النهائي أن هناك شيئا ما وهناك مشكلة.
اطلع على هذا المثال. هنا، لا توجد أخطاء في الجدول الأصلي، ولكن عمل التصفية ينشئ خطأ كلما كانت القيمة تساوي 0:
القيم -5 و-3 يتم تصفيتها بشكل صحيح. تؤدي القيم 0 إلى حدوث خطأ في معالجة عامل التصفية، وبالتالي يكون الأمر غير واضح حول ما إذا كان ينبغي تضمين السجل في النتيجة أم لا. لتحقيق أقصى قدر من الشفافية للمستخدمين النهائيين ومساعدة صانعي التصحيح، تتضمن العملية سجل خطأ بدلا من الأصلي. في هذه الحالة، يقوم IsError( Index( output, 2 ) ) بعرض القيمة true.
أخطاء مصدر البيانات
الدوال التي تعمل على تعديل البيانات في مصادر البيانات، مثل Patch، وCollect، وRemove، وRemoveIf، وUpdate، وUpdateIf، وSubmitForm تبلغ عن الأخطاء بطريقتين:
- تقوم كل دالة من هذه الدالات بإرجاع قيمة خطأ كنتيجة للعملية. يمكنك الكشف عن الأخطاء باستخدام IsError واستبدال الأخطاء أو منعها باستخدام IfErrorوApp.OnError كالمعتاد.
- بعد العملية، ترجع الدالة Errors أيضا أخطاء العمليات السابقة. يمكن أن يكون هذا السلوك مفيدا لعرض رسالة الخطأ على شاشة نموذج دون الحاجة إلى التقاط الخطأ في متغير حالة.
على سبيل المثال، تتحقق هذه الصيغة من وجود خطأ من تجميع وتعرض رسالة خطأ مخصصة:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
تقوم الدالة Errors أيضًا بإرجاع معلومات حول الأخطاء السابقة أثناء عمليات وقت التشغيل. يمكن أن يكون من المفيد عرض خطأ على شاشة نموذج دون الحاجة إلى التقاط الخطأ في متغير حالة.
إعادة طرح الأخطاء
في بعض الأحيان تتوقع أخطاء محتملة ويمكنك تجاهلها بأمان. داخل IfError وApp.OnError، إذا تم الكشف عن خطأ يجب تمريره إلى المعالج الأعلى التالي، أعد طرحه باستخدام Error( AllErrors ).
إنشاء الأخطاء الخاصة بك
يمكنك أيضا إنشاء الأخطاء الخاصة بك باستخدام الدالة Error .
إذا قمت بإنشاء أخطاء خاصة بك، فاستخدم قيما أكبر من 1000 لتجنب التعارضات المحتملة مع قيم أخطاء النظام المستقبلية.
قيم تعداد نوع الخطأ
| تعداد ErrorKind | قيمة | الوصف |
|---|---|---|
| AnalysisError | 18 | خطأ النظام. هناك مشكلة في تحليل المحول البرمجي. |
| رمز_لغة_غير_صحيح | 14 | تم استخدام رمز لغة غير صالح أو غير معروف. |
| BadRegex | 15 | التعبير النمطي غير صالح. تحقق من بناء الجملة المستخدم مع الدوال IsMatch أو Match أو MatchAll. |
| Conflict | 6 | تم تغيير السجل الذي تقوم بتحديثه بالفعل في المصدر وتحتاج إلى حل التعارض. والحل الشائع هو حفظ أي تغييرات محلية وتحديث السجل ثم إعادة تطبيق التغييرات. |
| القيود منتهكة | 8 | لم ينجح السجل في اجتياز فحص القيود على الخادم. |
| CreatePermission | 3 | ليس لديك الإذن لإنشاء سجل لمصدر البيانات. على سبيل المثال، تم استدعاء الدالة Collect. |
| حذف الأذونات | 5 | ليس لديك الإذن لحذف سجل لمصدر البيانات. على سبيل المثال، تم استدعاء الدالة Remove. |
| Div0 | 13 | القسمة على صفر. |
| EditPermissions | 4 | ليس لديك الإذن لإنشاء سجل لمصدر البيانات. على سبيل المثال، تم استدعاء الدالة Patch. |
| GeneratedValue | 9 | تم تمرير قيمة خطأ إلى الخادم لحقل يحسبه الخادم تلقائيا. |
| استخدام الوظيفة غير صالح | 16 | استخدام الدالة غير صالح. في الغالب تكون وسيطة واحدة أو أكثر من وسيطات الدالة غير صحيحة أو تستخدم بطريقة غير صالحة. |
| تعذر العثور على الملف | 17 | تعذر العثور على موقع تخزين SaveData. |
| ذاكرة غير كافية | 21 | لا توجد ذاكرة أو تخزين كافية على الجهاز للعملية. |
| InvalidArgument | 25 | تم تمرير وسيطة غير صالحة إلى دالة. |
| داخلي | 26 | خطأ النظام. هناك مشكلة داخلية في إحدى الدالات. |
| مفقود/مطلوب | 2 | حقل مطلوب من السجل مفقود. |
| Network | 23 | هناك مشكلة في اتصالات الشبكة. |
| None | 1 | خطأ النظام. لا يوجد خطأ. |
| غير قابل للتطبيق | 27 | لا تتوفر قيمة. هذا الخطأ مفيد للتمييز بين قيمة فارغة يمكن التعامل معها على أنها صفر في العمليات الحسابية الرقمية، من القيم الفارغة التي يجب وضع علامة عليها على أنها مشكلة محتملة إذا تم استخدام القيمة. |
| غير موجود | 7 | تعذر العثور على السجل. على سبيل المثال، السجل الذي سيتم تعديله في دالة Patch. |
| غير مدعوم | 20 | العملية غير مدعومة من قبل هذا المشغل أو الجهاز. |
| رقمي | 24 | تم استخدام دالة رقمية بطريقة غير صحيحة. على سبيل المثال، تعرض Sqrt القيمة -1. |
| تجاوز الحصة | 22 | تجاوز حد التخزين. |
| ReadOnlyValue | 10 | العمود للقراءة فقط ولا يمكن تعديله. |
| إذن القراءة (ReadPermission) | 19 | ليس لديك الإذن لقراءة السجلات لمصدر البيانات. |
| مزامنة | 1 | أبلغ مصدر البيانات عن خطأ. تحقق من عمود الرسالة لمزيد من المعلومات. |
| غير معروف | 12 | حدث خطأ، ولكن من نوع غير معروف. |
| التحقق من الصحة | 11 | لم يمر السجل بتحقق من الصحة. |