الدالات 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 ) )

قد يعرض مثال الصيغة أعلاه الشعار التالي عند تنشيط الزرين بالتسلسل:

تم تنشيط عنصر تحكم الزر، حيث يعرض إشعارًا من الدالة Notify.

وعادةً ما يكون هناك خطأ واحد فقط يمكن أن تتعامل مع الدالة 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 أي خطأ.

بناء الجملة

Error( ErrorRecord )
Error( ErrorTable )

  • ErrorRecord – مطلوب. سجل معلومات الأخطاء، بما في ذلك النوع والرسالة والحقول الأخرى. Kind مطلوب. يمكن تمرير FirstError مباشرة.
  • ErrorTable – مطلوب. جدول سجلات معلومات الأخطاء. يمكن تمرير AllErrors مباشرة.

IfError( Value1, Replacement1 [, Value2, Replacement2, ... [, DefaultResult ] ] )

  • القيمة (القيم) – مطلوبة. الصيغة (الصيغ) المراد اختبارها لقيمة خطأ.
  • الاستبدال (الاستبدالات) – مطلوب. الصيغ المراد تقييمها والقيم المراد إرجاعها إذا أرجعت وسيطات القيمة خطأ.
  • DefaultResult – اختياري. الصيغ المراد تقييمها إذا لم تعثر الصيغة على أي أخطاء.

IsError( القيمة )
IsBlankOrError( القيمة )

  • Value – مطلوبة. الصيغة المراد اختبارها.

الأمثلة

وظيفة IfError بسيطة

الصيغة الوصف النتيجة
IfError( 1, 2 ) الوسيطة الأولى ليست خطأ. لا تحتوي الوظيفة على أخطاء أخرى للتحقق منها ولا توجد قيمة إرجاع افتراضية. تقوم الوظيفة بإرجاع وسيطة القيمة الأخيرة التي تم تقييمها. 1
IfError( 1/0, 2 ) تُرجع الوسيطة الأولى قيمة خطأ (بسبب القسمة على صفر). تقوم الوظيفة بتقييم الوسيطة الثانية وإرجاعها كنتيجة. 2
IfError( 10, 20, 30 ) الوسيطة الأولى ليست خطأ. لا تحتوي الوظيفة على أخطاء أخرى للتحقق منها ولكن لها قيمة إرجاع افتراضية. تُرجع القيمة وسيطة DefaultResult. 30
IfError( 10, 11, 20, 21, 300 ) الوسيطة الأولى 10 ليست خطأ، لذا فإن الوظيفة لا تقوم بتقييم الاستبدال المقابل للوسيطة بأنه 11. الوسيطة الثالثة 20 ليست خطأ كذلك، لذا فإن الوظيفة لا تقوم بتقييم الاستبدال المقابل للوسيطة بأنه 21. الوسيطة الخامسة 300 لا تتضمن أي استبدال مقابل وهي النتيجة الافتراضية. تُرجع الوظيفة نتيجة لأن الصيغة لا تحتوي على أي أخطاء. 300
IfError( 1/0, Notify( "كانت هناك مشكلة داخلية" ) ) تُرجع الوسيطة الأولى قيمة خطأ (بسبب القسمة على صفر). وتقيم الوظيفة الوسيطة الثانية وتعرض رسالة للمستخدم. قيمه إرجاع وظيفة IfError هي قيمة إرجاع الإشعار المفروضة على نفس نوع الوسيطة الأولى إلى IfError (رقم). 1

وظيفة IsError بسيطة

صيغة ‏‏الوصف النتيجة
IsError( 1 ) الوسيطة ليست خطأ. true
IsError( Blank() ) الوسيطة فارغة، لكنها ليست خطأ. true
IsError( 1/0 ) الوسيطة عبارة عن خطأ. true
If( IsError( 1/0 ), Notify( "كانت هناك مشكلة داخلية" ) ) تقوم وسيطة IsError بإرجاع قيمة خطا (بسبب القسمة على صفر). تقوم هذه الوظيفة بإرجاع صواب، التي تتسبب في أن تعرض If رسالة للمستخدم باستخدام وظيفة Notify. قيمه إرجاع وظيفة If هي قيمة إرجاع الإشعار المفروضة على نفس نوع الوسيطة الأولى إلى If (قيمة منطقية). true

IsBlankOrError بسيط

الصيغة الوصف النتيجة
IsBlankOrError( 1 ) الوسيطة ليست خطأ أو فارغة. true
IsBlankOrError( Blank() ) الوسيطة فارغة. true
IsBlankOrError( 1/0 ) الوسيطة عبارة عن خطأ. true

خطأ بسيط

في هذا المثال، يتم التحقق من صحة التواريخ بالنسبة إلى بعضها البعض، مما يؤدي إلى حدوث خطأ في حالة وجود مشكلة.

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 ) )

خطوة بخطوة

  1. أضف عنصر تحكم Text input، وقم بتسميته TextInput1، إذا لم يكن يحتوي على الاسم بشكل افتراضي.

  2. أضف عنصر تحكم Label، وقم بتسميته Label1، إذا لم يكن يحتوي على الاسم بشكل افتراضي.

  3. قم بتعيين الصيغة لـ Label1 الذي به خاصية Text إلى:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. في TextInput1، أدخل 1234.

    ستعرض Label1 القيمة 1234 لأن هذا الإدخال صالح لوظيفة القيمة.

  5. في TextInput1، أدخل ToInfinity.

    ستعرض Label1 القيمة -1 لأن هذا الإدخال غير صالح لوظيفة القيمة. بدون تلخيص وظيفة القيمة باستخدام IfError، لن تظهر التسمية أي قيمة حيث يتم التعامل مع قيمة الخطأ على أنها فارغة.

راجع أيضًا

مرجع صيغة Power Apps