الدالات Error وIfError وIsError وIsBlankOrError
ينطبق على: أعمدة صيغة تطبيقات Dataverse اللوحة تدفقات سطح المكتب التطبيقات المستندة Power Pages Power Platform إلى النموذج CLI
يمكن استخدام هذه الدوال في اكتشاف الأخطاء وتوفير قيمة بديلة أو اتخاذ اجراء. كما يمكن استخدامها لإنشاء خطأ مخصص أو تمرير خطأ.
ملاحظة
إذا قام أحد التطبيقات بتعطيل ميزة إدارة الأخطاء على مستوى الصيغة ضمن إعدادات>التحديثات>المستبعدة، فلن تعمل هذه الوظائف بشكل صحيح.
الدالة IfError
تختبر الدالة IfError القيم حتى تعثر على خطأ. إذا اكتشفت الوظيفة خطأ، فإنها تقوم بتقييم وإرجاع قيمة استبدال مقابلة وإيقاف التقييم الإضافي. يمكن أيضًا توفير قيمة افتراضية عندما لا يتم العثور على أخطاء. تشبه بنية IfError البنية الخاصة بوظيفة If: تقوم وظيفة IfError بالاختبار للحصول على الأخطاء، بينما تقوم وظيفة If بالاختبار للحصول على صواب.
استخدم وظيفة IfError لاستبدال خطأ بقيمة صالحة بحيث يمكن متابعة العمليات الجارية. على سبيل المثال، استخدم هذه الوظيفة إذا كان إدخال المستخدم قد ينتج عنه قسمة على صفر:
IfError( 1/x, 0 )
ترجع 0
هذه الصيغة إذا كانت قيمة x
صفر ، حيث 1/x
ينتج خطأ. إذا لم تكن x
تساوي صفر، فإنه يتم إرجاع 1/x
.
إيقاف المعالجة الإضافية
عند سلسلة صيغ معًا في صيغ السلوك، مثل:
Patch( DS1, ... );
Patch( DS2, ... )
ستجري محاولة تنفيذ وظيفة Patch الثانية لـ DS2
حتى في حالة فشل التصحيح لـ DS1
. يقتصر نطاق الخطأ على كل صيغة متسلسلة.
استخدم وظيفة IfError للقيام بإجراء والاستمرار في المعالجة فقط في حالة نجاح الإجراء. تطبيق وظيفة IfError على هذا المثال:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ),
Patch( DS2, ... ), Notify( "problem in the second action" )
)
إذا كان Patch الخاص بـ DS1
يحتوي على مشكلة، فإنه يتم تنفيذ الإخطار الأول. لا تحدث معالجة أخرى بما في ذلك Patch الثاني لـ DS2
. في حالة نجاح Patch الثاني، فسيتم تنفيذ Patch الثاني.
في حالة توفيرها، يتم إرجاع وسيطة DefaultResult الاختيارية هذه في حالة عدم اكتشاف أي أخطاء. من دون هذه الوسيطة، يتم إرجاع وسيطة القيمة الأخيرة.
بناء على المثال الأخير، يمكن التحقق من قيمة الإرجاع من وظيفة IfError لتحديد ما إذا كانت هناك أي مشكلات:
IfError(
Patch( DS1, ... ), Notify( "problem in the first action" ); false,
Patch( DS2, ... ), Notify( "problem in the second action" ); false,
true
)
توافق النوع
ترجع الدالة IfError قيمة إحدى وسيطاتها. يجب أن تكون أنواع جميع القيم التي يمكن إرجاعها من وظيفة IfError متوافقة.
في المثال الأخير، ترجع الدسمة Patch سجلا غير متوافق مع القيم المنطقية المستخدمة لصيغ الاستبدال أو DefaultResult. وهو أمر جيد، لأنه لا يوجد موقف يتم فيه إرجاع قيمة الإرجاع من هذه استدعاءات Patch من وظيفة IfError.
ملاحظة
في حين أن السلوك قيد عملية التغيير، فيجب أن تكون أنواع جميع الوسيطات لـ IfError متوافقة حاليًا.
في المثال البسيط الموضح سابقًا:
IfError( 1/x, 0 )
أنواع 1/x
و0
كانت متوافقة مع الرقمين. إذا لم تكن كذلك ، يتم إجبار الحجة الثانية على مطابقة نوع الوسيطة الأولى.
يعرض Excel#DIV/0! عندما يحدث القسمة على الصفر.
فكر في وظيفة IfError مع التالي بدلاً من ذلك:
IfError( 1/x, "#DIV/0!" )
لن تعمل الصيغة السابقة. يتم فرض السلسلة "#DIV/0!"
النصية على نوع الوسيطة الأولى إلى IfError ، وهو رقم. نتيجة IfError هي خطأ آخر حيث لا يمكن إجبار السلسلة النصية. كإصلاح ، قم بتحويل الوسيطة الأولى إلى سلسلة نصية بحيث تقوم وظيفة IfError بإرجاع سلسلة نصية دائمًا.
IfError( Text( 1/x ), "#DIV/0!" )
كما هو موضح أعلاه، يمكن لوظيفة IfError إرجاع خطأ إذا كان الاستبدال أو DefaultResult عبارة عن خطأ.
FirstError / AllErrors
داخل صيغ الاستبدال، تتوفر المعلومات حول الأخطاء من خلال السجل FirstError وجدول AllErrors. AllErrors هو جدول لسجلات معلومات الخطأ مع كون FirstError اختصارا للسجل الأول من هذا الجدول. يقوم FirstError دائما بإرجاع نفس القيمة مثل First (AllErrors).
سجلات الخطأ تتضمن:
الحقل | نوع | الوصف |
---|---|---|
نوع | تعددا ErrorKind (رقم) | فئة الخطأ. |
رسالة | السلسلة النصية | رسالة حول الخطأ، تناسب العرض إلى المستخدم النهائي. |
مصدر | السلسلة النصية | الموقع الذي تم فيه إنشاء الخطأ، المستخدم لإعداد التقارير. على سبيل المثال، بالنسبة لصيغة مرتبطة بخاصية عنصر تحكم، تكون هذه القيمة في النموذج ControlName.PropertyName. |
لاحظ | السلسلة النصية | الموقع الذي ظهر به الخطأ للمستخدم، يتم استخدامه لإعداد التقارير. على سبيل المثال، بالنسبة لصيغة مرتبطة بخاصية عنصر تحكم، تكون هذه القيمة في النموذج ControlName.PropertyName. |
التفاصيل | سجل | تفاصيل حول الخطأ. حاليا ، يتم توفير التفاصيل فقط لأخطاء الشبكة. يتضمن هذا السجل HttpStatusCode الذي يحتوي على رمز حالة HTTP وHttpResponse، الذي يحتوي على نص الاستجابة من الموصل أو الخدمة. |
على سبيل المثال، فكر في استخدام الصيغة التالية كعنصر تحكم Button به خاصية OnSelect:
Set( a, 1/0 )
وهذه الصيغة على الخاصية OnSelect لعنصر تحكم ثانٍ Button:
IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )
قد يعرض مثال الصيغة أعلاه الشعار التالي عند تنشيط الزرين بالتسلسل:
عادة ، سيكون هناك خطأ واحد فقط يمكن ل FirstError العمل معه بشكل كاف. ومع ذلك، هناك سيناريوهات يمكن فيها إرجاع أخطاء متعددة. على سبيل المثال، عند استخدام عامل تسلسل الصيغة أو الدالة المتزامنة. حتى في هذه المواقف، قد يكون إعداد تقارير في FirstError كافيًا للكشف عن وجود مشكلة بدلاً من تحميل مستخدم بأخطاء متعددة بشكل زائد. إذا كان لا يزال لديك متطلب للعمل مع كل خطأ على حدة، يمكنك استخدام الجدول AllErrors.
IsError
تقوم وظيفة IsError بالاختبار للحصول على قيمة خطأ.
وتكون قيمة الإرجاع هي القيمة المنطقية صواب أو خطأ.
يؤدي استخدام IsError إلى منع أي معالجة أخرى للخطأ.
IsBlankOrError
تختبر وظيفة IsBlankOrError إما قيمة فارغة أو قيمة خطأ وهي تعادل Or( IsBlank( X ), IsError( X ) )
.
عند تمكين معالجة الأخطاء للتطبيقات الحالية ، ضع في اعتبارك استبدال IsBlank بـ IsBlankOrError للحفاظ على سلوك التطبيق الحالي. قبل إضافة معالجة الأخطاء ، تم استخدام قيمة فارغة لتمثيل كل من القيم الفارغة من قواعد البيانات وقيم الخطأ. تفصل معالجة الخطأ بين هذين التفسيرات لـ فارغ مما قد يغير سلوك التطبيقات الحالية التي تستمر في استخدام IsBlank.
وتكون قيمة الإرجاع هي القيمة المنطقية صواب أو خطأ.
يمنع استخدام IsBlankOrError أي معالجة أخرى للخطأ.
استخدم الدالة Error لإنشاء خطأ مخصص والإبلاغ عنه. على سبيل المثال، قد يكون لديك منطق لتحديد ما إذا كانت هناك قيمة محددة صالحة للسياق أم لا، ل يتم التحقق من شيء ما للتأكد من عدم وجود مشكلة تلقائيًا. يمكنك إنشاء الخطأ الخاص بك وإعادته والإكمال باستخدام نوع و رسالة، باستخدام السجل نفسه الموصوف أعلاه للدالة IfError.
في سياق IfError، استخدم الدالة Error لإعادة الطرح أو المرور عبر خطأ. على سبيل المثال، قد يقرر المنطق الخاص بك في IfError أنه في بعض الحالات يمكن تجاهل الخطأ بأمان، ولكن في حالات أخرى يكون من المهم إرسال الخطأ. خلال IfError أو App.OnError، استخدم Error( FirstError ) للمرور عبر خطأ.
يمكن أيضًا تمرير الدالة Error إلى جدول أخطاء، كما هو موجود في الجدول AllErrors. استخدم Error( AllErrors ) لإعادة طرح كافة الأخطاء وليس الخطأ الأول فقط.
لا ينتج عن سجل فارغ أو جدول فارغ تم تمريره إلى Error أي خطأ.
بناء الجملة
خطأ( سجل خطأ )
خطأ( جدول الخطأ)
- سجل الخطأ - مطلوب. سجل معلومات الأخطاء، بما في ذلك النوع والرسالة والحقول الأخرى. النوع مطلوب. يمكن تمرير الخطأ الأول مباشرة.
- جدول الخطأ- مطلوب. جدول سجلات معلومات الأخطاء. يمكن تمرير AllErrors مباشرة.
IfError ( القيمة 1 ، الاستبدال 1 [، القيمة 2 ، الاستبدال 2 ، ... [، النتيجة الافتراضية ] ] )
- القيم - مطلوب. الصيغة (الصيغ) المراد اختبارها لقيمة خطأ.
- البدائل - مطلوب. الصيغ المراد تقييمها والقيم المراد إرجاعها إذا أرجعت وسيطات القيمة خطأ.
- النتيجة الافتراضية- اختياري. الصيغ المراد تقييمها إذا لم تعثر الصيغة على أي أخطاء.
IsError( القيمة )
IsBlankOrError( value )
- القيمة - مطلوبة. الصيغة المراد اختبارها.
الأمثلة
وظيفة IfError بسيطة
الصيغة | الوصف | النتيجة |
---|---|---|
إذا كان الخطأ ( 1 ، 2 ) | الوسيطة الأولى ليست خطأ. لا تحتوي الوظيفة على أخطاء أخرى للتحقق منها ولا توجد قيمة إرجاع افتراضية. تقوم الوظيفة بإرجاع وسيطة القيمة الأخيرة التي تم تقييمها. | 1 |
إذا كان الخطأ (1/0 ، 2) | تُرجع الوسيطة الأولى قيمة خطأ (بسبب القسمة على صفر). تقوم الوظيفة بتقييم الوسيطة الثانية وإرجاعها كنتيجة. | 2 |
إذا كان الخطأ (10 ، 20 ، 30) | الوسيطة الأولى ليست خطأ. لا تحتوي الوظيفة على أخطاء أخرى للتحقق منها ولكن لها قيمة إرجاع افتراضية. تُرجع القيمة وسيطة DefaultResult. | 30 |
إذا كان الخطأ (10 ، 11 ، 20 ، 21 ، 300) | الوسيطة الأولى 10 ليست خطأ، لذا فإن الوظيفة لا تقوم بتقييم الاستبدال المقابل للوسيطة بأنه 11. الوسيطة الثالثة 20 ليست خطأ كذلك، لذا فإن الوظيفة لا تقوم بتقييم الاستبدال المقابل للوسيطة بأنه 21. الوسيطة الخامسة 300 لا تتضمن أي استبدال مقابل وهي النتيجة الافتراضية. تُرجع الوظيفة نتيجة لأن الصيغة لا تحتوي على أي أخطاء. | 300 |
IfError (1/0 ، إخطار ( "حدثت مشكلة داخلية") | تُرجع الوسيطة الأولى قيمة خطأ (بسبب القسمة على صفر). وتقيم الوظيفة الوسيطة الثانية وتعرض رسالة للمستخدم. قيمه إرجاع وظيفة IfError هي قيمة إرجاع الإشعار المفروضة على نفس نوع الوسيطة الأولى إلى IfError (رقم). | 1 |
وظيفة IsError بسيطة
صيغة | الوصف | النتيجة |
---|---|---|
إي أخطأ( 1 ) | الوسيطة ليست خطأ. | خطأ |
IsError( فارغ() ) | الوسيطة فارغة، لكنها ليست خطأ. | خطأ |
خطأ ( 1/0 ) | الوسيطة عبارة عن خطأ. | صحيح |
إذا (IsError (1/0) ، إخطار ( "حدثت مشكلة داخلية") | تقوم وسيطة IsError بإرجاع قيمة خطا (بسبب القسمة على صفر). تقوم هذه الوظيفة بإرجاع صواب، التي تتسبب في أن تعرض If رسالة للمستخدم باستخدام وظيفة Notify. قيمه إرجاع وظيفة If هي قيمة إرجاع الإشعار المفروضة على نفس نوع الوسيطة الأولى إلى If (قيمة منطقية). | صحيح |
IsBlankOrError بسيط
الصيغة | الوصف | النتيجة |
---|---|---|
إيسبلانكوروورويل( 1 ) | الوسيطة ليست خطأ أو فارغة. | خطأ |
IsBlankOrError( فارغ() ) | الوسيطة فارغة. | صحيح |
إيسبلانكور خطأ ( 1/0 ) | الوسيطة عبارة عن خطأ. | صحيح |
خطأ بسيط
في هذا المثال، يتم التحقق من صحة التواريخ بالنسبة إلى بعضها البعض، مما يؤدي إلى حدوث خطأ في حالة وجود مشكلة.
If( StartDate > EndDate,
Error( { Kind: ErrorKind.Validation, Message: "Start Date must be before End Date" } ) )
في هذا المثال، يُسمح بتمرير بعض الأخطاء بينما يتم منع أخرى واستخدام قيمة لتحل محلها. في الحالة الأولى ، يكون b في حالة خطأ لأن الدالة Value تحتوي على وسيطة غير صالحة. نظرا لأن هذا غير متوقع من قبل كاتب الصيغة ، يتم تمريره حتى يراه المستخدم. في الحالة الثانية ، بنفس الصيغة ، b له القيمة 0 ، مما يؤدي إلى القسمة على الصفر. في هذه الحالة، قد يعرف كاتب الصيغة أن هذا أمر مقبول لهذا المنطق، ويمنع الخطأ (لا يتم عرض أية شعارات) ثم يرجع -1 بدلاً من 0.
With( {a: 1, b: Value("a")},
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns an error with Kind = ErrorKind.InvalidArgument
With( {a: 1, b: 0} )
IfError( a/b, If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ), -1 ) ) )
// returns -1
يمكن تصفية الجدول AllErrors مثل أي جدول آخر. باستخدام دالة Error يمكن إزالة الأخطاء المتوقعة والاحتفاظ بالأخطاء المتبقية والإبلاغ عنها. على سبيل المثال ، إذا علمنا أن القسمة على صفر لن تكون مشكلة في سياق معين ، فيمكن تصفية هذه الأخطاء ، مع ترك جميع الأخطاء الأخرى سليمة بالصيغة التالية:
Error( Filter( AllErrors, Kind <> ErrorKind.Div0 ) )
خطوة بخطوة
أضف عنصر تحكم Text input، وقم بتسميته TextInput1، إذا لم يكن يحتوي على الاسم بشكل افتراضي.
أضف عنصر تحكم Label، وقم بتسميته Label1، إذا لم يكن يحتوي على الاسم بشكل افتراضي.
قم بتعيين الصيغة لـ Label1 الذي به خاصية Text إلى:
IfError( Value( TextInput1.Text ), -1 )
في TextInput1، أدخل 1234.
يظهر Label1 القيمة 1234 لأن هذا إدخال صالح لدالة القيمة.
في TextInput1، أدخل ToInfinity.
يعرض Label1 القيمة -1 لأن هذا ليس إدخالا صالحا لدالة القيمة. بدون تلخيص وظيفة القيمة باستخدام IfError، لن تظهر التسمية أي قيمة حيث يتم التعامل مع قيمة الخطأ على أنها فارغة.