แชร์ผ่าน


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

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

ค่าที่ส่งกลับเป็นบูลีน จริง หรือ เท็จ

การใช้ IsBlankOrError จะป้องกันการประมวลผลข้อผิดพลาดเพิ่มเติม

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

ในบริบทของ IfError ให้ใช้ฟังก์ชัน Error เพื่อส่งซ้ำหรือส่งผ่านข้อผิดพลาด ตัวอย่างเช่น ตรรกะของคุณใน IfError อาจตัดสินใจว่าในบางกรณีสามารถละเว้นข้อผิดพลาดได้อย่างปลอดภัย แต่ในบางกรณีข้อผิดพลาดมีความสำคัญในการส่ง ภายใน IfError หรือ App.OnError ใช้ Error( FirstError ) เพื่อส่งข้อผิดพลาด

ฟังก์ชัน Error ยังสามารถส่งตารางของข้อผิดพลาดได้ ดังที่พบในตาราง AllErrors ใช้ Error( AllErrors ) เพื่อส่งข้อผิดพลาดทั้งหมดซ้ำ ไม่ใช่แค่ข้อผิดพลาดแรก

เรกคอร์ด ว่างเปล่า หรือตารางที่ว่างเปล่าที่ส่งผ่าน Error เป็นการแสดงว่าไม่มีข้อผิดพลาด

ไวยากรณ์

Error( ErrorRecord )
Error( ErrorTable )

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

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

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

IsError( Value )
IsBlankOrError( ค่า )

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

ตัวอย่าง

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

IsError แบบง่าย

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

IsBlankOrError อย่างง่าย

สูตร รายละเอียด ผลลัพธ์
IsBlankOrError( 1 ) อาร์กิวเมนต์ไม่ใช่ข้อผิดพลาดหรือว่างเปล่า เท็จ
IsBlankOrError( Blank() ) อาร์กิวเมนต์ว่างเปล่า จริง
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 เนื่องจากเป็นข้อมูลที่ป้อนที่ถูกต้อง ไปยังฟังก์ชัน Value

  5. ใน TextInput1 ป้อน ToInfinity

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

ดูเพิ่มเติม

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