แชร์ผ่าน


ฟังก์ชัน Error, IfError, IsError, IsBlankOrError

นำไปใช้กับ: แอปพลิเคชัน Canvas Dataverse คอลัมน์สูตร โฟลว์เดสก์ท็อป แอปพลิเคชันที่ใช้โมเดล Power Pages Power Platform CLI

ตรวจพบข้อผิดพลาดและแสดงค่าแสดงแทน หรือใช้การดำเนินการ สร้างข้อผิดพลาดที่กำหนดเองหรือส่งผ่านข้อผิดพลาด

หมายเหตุ

หากแอปได้ปิดใช้งานคุณลักษณะ การจัดการข้อผิดพลาดในระดับสูตร ภายใต้ การตั้งค่า>การอัปเดต>ยกเลิก ฟังก์ชันเหล่านั้นจะไม่ทำงานอย่างถูกต้อง

IfError

ฟังก์ชัน IfError ทดสอบค่าจนกว่าจะพบข้อผิดพลาด หากฟังก์ชันพบข้อผิดพลาด ฟังก์ชันจะประเมินและส่งคืนค่าการแทนที่ที่สอดคล้องกันและหยุดการประเมินเพิ่มเติม สามารถกำหนดค่าเริ่มต้นเมื่อไม่พบข้อผิดพลาด โครงสร้างของ IfError คล้ายกับของฟังก์ชัน If: IfError ทดสอบข้อผิดพลาดขณะที่ ถ้า ทดสอบ จริง

ใช้ 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 ส่งคืนระเบียนที่ไม่เข้ากันได้กับค่าบูลีนที่ใช้สำหรับสูตร Replacement หรือ 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 ) เสมอ

เรกคอร์ดข้อผิดพลาดประกอบด้วย:

ฟิลด์ ชนิด คำอธิบาย
ใจดี Enum ErrorKind (จำนวน) ประเภทของข้อผิดพลาด
ข้อความ สตริงข้อความ ข้อความเกี่ยวกับข้อผิดพลาด ที่เหมาะสมที่จะแสดงให้ผู้ใช้ปลายทาง
แหล่งที่มา สตริงข้อความ ตำแหน่งที่เกิดข้อผิดพลาด ใช้สำหรับการรายงาน ตัวอย่างเช่น สำหรับสูตรที่เชื่อมโยงกับคุณสมบัติการควบคุม ค่านี้จะอยู่ในฟอร์ม ControlName.PropertyName
สังเกตได้ สตริงข้อความ ตำแหน่งที่ผู้ใช้พบข้อผิดพลาด ใช้สำหรับการรายงาน ตัวอย่างเช่น สำหรับสูตรที่เชื่อมโยงกับคุณสมบัติการควบคุม ค่านี้จะอยู่ในฟอร์ม ControlName.PropertyName
รายละเอียด บันทึก รายละเอียดเกี่ยวกับข้อผิดพลาด ขณะนี้รายละเอียดมีให้เฉพาะข้อผิดพลาดของเครือข่ายเท่านั้น เรกคอร์ดนี้ประกอบด้วย HttpStatusCode ที่มีรหัสสถานะ HTTP และ HttpResponse ซึ่งมีเนื้อความของการตอบสนองจากตัวเชื่อมต่อหรือบริการ

ตัวอย่างเช่น พิจารณาสูตรต่อไปนี้เป็นตัวควบคุม ปุ่ม ที่มีคุณสมบัติ OnSelect:

Set( a, 1/0 )

และสูตรนี้บนคุณสมบัติ OnSelect ของตัวควบคุม ปุ่ม ที่สอง:

IfError( a, Notify( "Internal error: originated on " & FirstError.Source & ", surfaced on " & FirstError.Observed ) )

สูตรตัวอย่างด้านบนจะแสดงแบนเนอร์ต่อไปนี้เมื่อเปิดใช้งานปุ่มสองปุ่มตามลำดับ:

เปิดใช้งานตัวควบคุม ปุ่ม เพื่อแสดงการแจ้งเตือนจากฟังก์ชัน Notify

โดยปกติแล้วจะมีเพียงหนึ่งข้อผิดพลาดที่ FirstError สามารถทำงานได้เพียงพอ อย่างไรก็ตาม มีบางสถานการณ์ที่อาจส่งคืนข้อผิดพลาดหลายรายการ ตัวอย่างเช่น เมื่อใช้ ตัวดำเนินการการเกี่ยวโยงของสูตร หรือ ฟังก์ชัน Concurrent แม้ในสถานการณ์เหล่านี้ การรายงาน 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 เป็นการแสดงว่าไม่มีข้อผิดพลาด

ไวยากรณ์

ข้อผิดพลาด( ErrorRecord )
ข้อผิดพลาด( ErrorTable )

  • ErrorRecord – จำเป็น เรกคอร์ดข้อมูลข้อผิดพลาด รวมถึง รูปแบบ, ข้อความ และฟิลด์อื่นๆ ชนิด เป็นสิ่งจำเป็น FirstError สามารถส่งผ่านได้โดยตรง
  • ErrorTable – จำเป็น ตารางของเรกคอร์ดข้อมูลข้อผิดพลาด AllErrors สามารถส่งผ่านได้โดยตรง

หากข้อผิดพลาด( Value1, Replacement1 [, Value2 , การแทนที่2, ... [, ผลลัพธ์เริ่มต้น ] ] )

  • ค่า – จำเป็น สูตรที่จะทดสอบค่าผิดพลาด
  • การทดแทน – จำเป็น สูตรที่จะประเมินและค่าที่จะส่งกลับ ถ้าอาร์กิวเมนต์ ค่า การจับคู่ ส่งกลับข้อผิดพลาด
  • DefaultResult – ไม่บังคับ สูตรที่ใช้ประเมินหากสูตรไม่พบข้อผิดพลาดใดๆ

มีข้อผิดพลาด( ค่า )
IsBlankOrError( ค่า )

  • ค่า – จำเป็น สูตรที่จะทดสอบ

ตัวอย่าง

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, Notify( "มีปัญหาภายใน" ) ) อาร์กิวเมนต์แรกส่งคืนค่าผิดพลาด (เนื่องจากหารด้วยศูนย์) ฟังก์ชันประเมินอาร์กิวเมนต์ และแสดงข้อความให้ผู้ใช้ทราบ ค่าที่ส่งกลับของ IfError คือค่าที่ส่งกลับของ แจ้งให้ทราบ ซึ่งถูกบังคับให้เป็นชนิดเดียวกับอาร์เมนต์แรกของ IfError (ตัวเลข) 1

IsError แบบง่าย

สูตร คำอธิบาย ผลลัพธ์
มีข้อผิดพลาด( 1 ) อากิวเมนต์ไม่ใช่ข้อผิดพลาด เท็จ
IsError(ว่างเปล่า()) อาร์กิวเมนต์ว่างเปล่า แต่ไม่ใช่ข้อผิดพลาด เท็จ
มีข้อผิดพลาด( 1/0 ) อากิวเมนต์เป็นข้อผิดพลาด จริง
If( IsError( 1/0 ), Notify( "มีปัญหาภายใน" ) ) อาร์กิวเมนต์ IsError ส่งคืนค่าผิดพลาด (เนื่องจากหารด้วยศูนย์) ฟังก์ชันนี้ส่งคืน จริง ซึ่งทำให้ If แสดงข้อความถึงผู้ใช้ด้วยฟังก์ชัน Notify ค่าที่ส่งกลับของ If คือค่าที่ส่งกลับของ Notify ซึ่งถูกบังคับให้เป็นชนิดเดียวกับอาร์เมนต์แรกของ ถา (บูลีน) จริง

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 แทน

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. เพิ่มตัวควบคุม การป้อนข้อความ และตั้งชื่อ TextInput1 ถ้าไม่มีชื่อที่เป็นค่าเริ่มต้น

  2. เพิ่มตัวควบคุม ป้ายชื่อ และตั้งชื่อ Label1 ถ้าไม่มีชื่อที่เป็นค่าเริ่มต้น

  3. ตั้งค่าสูตรสำหรับคุณสมบัติ Text ของ Label1 เป็น:

    IfError( Value( TextInput1.Text ), -1 )
    
  4. ใน TextInput1 ป้อน 1234

    Label1 แสดงค่า 1234 เนื่องจากนี่เป็นอินพุตที่ถูกต้องสำหรับฟังก์ชันค่า

  5. ใน TextInput1 ป้อน ToInfinity

    Label1 แสดงค่า -1 เนื่องจากนี่ไม่ใช่อินพุตที่ถูกต้องสำหรับฟังก์ชัน Value หากไม่มีการตัด ฟังก์ชัน Value ที่มี IfError ป้ายชื่ออาจไม่แสดงค่าใดเป็นข้อผิดพลาดเลย และจะถือว่าเป็นค่า ว่าง

ดูเพิ่มเติม

การอ้างอิงสูตรสำหรับ Power Apps