แชร์ผ่าน


การจัดการข้อผิดพลาด

หมายเหตุ

ลักษณะการทำงานที่อธิบายในบทความนี้จะใช้ได้เฉพาะเมื่อคุณลักษณะรุ่นพรีวิวของ การจัดการข้อผิดพลาดระดับสูตร ด้วยการเปิด การตั้งค่า>คุณลักษณะที่กำลังจะมาถึง>พรีวิว ข้อมูลเพิ่มเติม: การควบคุมคุณลักษณะที่จะเปิดใช้งาน

เกิดข้อผิดพลาดขึ้น เครือข่ายหยุดทำงาน พื้นที่เก็บข้อมูลเต็ม มีค่าที่ไม่คาดคิดเข้ามา สิ่งสำคัญคือตรรกะของคุณยังคงทำงานได้อย่างถูกต้องเมื่อเผชิญกับปัญหาที่อาจเกิดขึ้น

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

ในฐานะผู้สร้างแอป คุณสามารถควบคุมข้อผิดพลาดในแอปของคุณได้:

  • การตรวจหาและการจัดการข้อผิดพลาด หากมีโอกาสเกิดข้อผิดพลาด คุณสามารถเขียนสูตรของแอปเพื่อตรวจหาเงื่อนไขข้อผิดพลาดและลองดำเนินการใหม่อีกครั้ง ผู้ใช้ไม่จำเป็นต้องกังวลว่าจะเกิดข้อผิดพลาดเนื่องจากผู้สร้างคำนึงถึงความเป็นไปได้นี้ ซึ่งดำเนินการโดยฟังก์ชัน IfError, IsError และ IsErrorOrBlank ภายในสูตร
  • การรายงานข้อผิดพลาด ถ้าข้อผิดพลาดไม่ได้รับการจัดการในสูตรที่พบ ข้อผิดพลาดนั้นจะถูกเลื่อนไปจนถึงตัวจัดการ App.OnError ที่นี่ ข้อผิดพลาดไม่สามารถถูกแทนที่ได้อีกต่อไปเนื่องจากเกิดขึ้นแล้วและเป็นส่วนหนึ่งของการคำนวณสูตร แต่คุณสามารถใช้ App.OnError เพื่อควบคุมวิธีรายงานข้อผิดพลาดไปยังผู้ใช้ปลายทาง รวมถึงการระงับการรายงานข้อผิดพลาดทั้งหมดพร้อมกัน App.OnError ยังให้จุดคอขวดทั่วไปสำหรับการรายงานข้อผิดพลาดในแอปพลิเคชันทั้งหมดอีกด้วย
  • การสร้างและการส่งข้อผิดพลาดอีกครั้ง สุดท้าย คุณอาจตรวจพบเงื่อนไขข้อผิดพลาดด้วยตรรกะของคุณเอง ซึ่งเป็นเงื่อนไขเฉพาะสำหรับแอปของคุณ ใช้ฟังก์ชัน Error เพื่อสร้างข้อผิดพลาดที่กำหนดเอง ฟังก์ชัน Error ยังใช้ส่งข้อผิดพลาดอีกครั้งหลังจากการสอบถามใน IfError หรือ App.OnError

เริ่มต้นใช้งาน

ลองเริ่มต้นด้วยตัวอย่างง่ายๆ กัน

  1. สร้างหน้าจอใหม่ในแอปพื้นที่ทำงาน Power Apps
  2. แทรกตัวควบคุม TextInput โดยจะมีค่าเริ่มต้นเป็นชื่อ TextInput1
  3. แทรกตัวควบคุม Label
  4. ตั้งค่าคุณสมบัติ Text ของตัวควบคุม Label ไปที่สูตร
1/Value( TextInput1.Text )

แบนเนอร์ข้อผิดพลาดที่แสดงด้วย

เรามีข้อผิดพลาดเนื่องจากข้อความเริ่มต้นของตัวควบคุม TextInput เป็น "Text input" ซึ่งแปลงเป็นตัวเลขไม่ได้ ตามค่าเริ่มต้น นี่เป็นสิ่งที่ดี: ผู้ใช้ปลายทางจะได้รับการแจ้งเตือนว่ามีบางอย่างไม่ทำงานตามที่คาดหวังในแอป

เห็นได้ชัดว่าเราไม่ต้องการให้ข้อผิดพลาดแสดงต่อผู้ใช้ทุกครั้งที่เริ่มแอปนี้ เป็นไปได้ว่า "Text input" ไม่ใช่ค่าเริ่มต้นที่ถูกต้องสำหรับช่องป้อนข้อความ หากต้องการแก้ไขปัญหานี้ ให้เปลี่ยนคุณสมบัติ Default ของตัวควบคุม TextInput เป็น:

Blank()

แบนเนอร์ข้อผิดพลาดแสดงด้วย

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

0.25 แสดง และไม่มีแบนเนอร์แสดงข้อผิดพลาด

และถ้าเราพิมพ์บางอย่างไม่ถูกต้อง เช่น hello เราก็จะได้รับแบนเนอร์แสดงข้อผิดพลาด:

ไม่มีค่าแสดงและแบนเนอร์แสดงข้อผิดพลาดเนื่องจากไม่สามารถแปลง

นี่เป็นตัวอย่างเบื้องต้นง่ายๆ การจัดการข้อผิดพลาดสามารถทำได้หลายวิธี ขึ้นอยู่กับความต้องการของแอป:

  1. แทนที่จะเป็นแบนเนอร์ข้อผิดพลาด เราอาจแสดง "#Error" ในตัวควบคุม label ที่มีสูตร เพื่อให้ประเภทของการแทนที่เข้ากันได้กับอาร์กิวเมนต์แรกเป็น IfError เราจำเป็นต้องแปลงผลลัพธ์ที่เป็นตัวเลขเป็นสตริงข้อความอย่างชัดเจนด้วยฟังก์ชัน Text
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    ไม่มีแบนเนอร์ข้อผิดพลาดและแสดง #Error เป็นผลลัพธ์แทน
  2. แทนที่จะรวมอินสแตนซ์เฉพาะนี้ด้วย IfError เราสามารถเขียนตัวจัดการ App.OnError แบบรวมศูนย์ เราไม่สามารถแทนที่สตริงที่แสดงด้วย "#Error" เนื่องจากข้อผิดพลาดได้เกิดขึ้นแล้ว และ App.OnError มีไว้เพื่อควบคุมการรายงานเท่านั้น
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

การกระจายข้อผิดพลาด

ข้อผิดพลาดส่งผ่านสูตรมากเท่ากับที่ทำใน Excel ตัวอย่างเช่น ใน Excel ถ้าเซลล์ A1 มีสูตร =1/0 A1 จะแสดงค่าข้อผิดพลาด #DIV0!:

สเปรดชีต Excel ที่มี A1=1/0 และ #DIV/0! แสดงในเซลล์

ถ้าเซลล์ A2 อ้างถึง A1 ด้วยสูตร เช่น =A1*2 ข้อผิดพลาดก็จะกระจายผ่านสูตรนั้นด้วย:

สเปรดชีต Excel ที่มี A2=A1*2 และ #DIV/0! แสดงในเซลล์

ข้อผิดพลาดจะแทนที่ค่าที่อาจมีการคำนวณอย่างอื่น ไม่มีผลลัพธ์สำหรับการคูณในเซลล์ A2 มีเพียงข้อผิดพลาดจากการหารใน A1

Power Fx ทำงานในลักษณะเดียวกัน โดยทั่วไป หากมีการระบุข้อผิดพลาดเป็นอาร์กิวเมนต์ของฟังก์ชันหรือตัวดำเนินการ การดำเนินการจะไม่เกิดขึ้นและข้อผิดพลาดในการป้อนจะส่งผ่านเป็นผลลัพธ์ของการดำเนินการ ตัวอย่างเช่น Mid( Text( 1/0 ), 1, 1 ) จะส่งคืนข้อผิดพลาดการหารด้วยศูนย์ เนื่องจากข้อผิดพลาดส่วนใหญ่ที่อยู่ด้านในส่งผ่านฟังก์ชัน Text และฟังก์ชัน Mid:

แบนเนอร์ข้อผิดพลาดแสดงการดำเนินการที่ไม่ถูกต้อง: การหารด้วยศูนย์

โดยทั่วไป ข้อผิดพลาดไม่ได้ส่งผ่านคุณสมบัติตัวควบคุม Power Apps ลองขยายตัวอย่างก่อนหน้าด้วยตัวควบคุมเพิ่มเติมที่แสดงว่าคุณสมบัติ Text ของป้ายชื่อมีสถานะข้อผิดพลาด:

ไม่แสดงข้อผิดพลาดในการควบคุมป้ายกำกับที่สอง

เป็นเรื่องปกติที่ข้อผิดพลาดจะไม่กระจายผ่านตัวควบคุม เนื่องจากระบบจะสังเกตข้อผิดพลาดในการป้อนข้อมูลที่คุณสมบัติตัวควบคุมทั้งหมด ข้อผิดพลาดจะไม่หายไป

ฟังก์ชันและตัวดำเนินการส่วนใหญ่เป็นไปตามกฎ "ข้อผิดพลาดเข้า ข้อผิดพลาดออก" แต่มีข้อยกเว้นบางประการ ฟังก์ชัน IsError, IsErrorOrBlank และ IfError ออกแบบมาสำหรับการทำงานกับข้อผิดพลาด ดังนั้นจึงไม่สามารถส่งกลับข้อผิดพลาดแม้ว่าจะมีการส่งผ่านไปยังข้อผิดพลาดเหล่านั้นก็ตาม

การสังเกตข้อผิดพลาด

ไม่พบข้อผิดพลาดจนกว่าจะใช้ค่า

ด้วยเหตุนี้ ฟังก์ชัน If และ Select อาจไม่ส่งกลับข้อผิดพลาดหากมีการส่งผ่านเข้ามา ลองป้อนสูตร If( false, 1/0, 3 ) มีข้อผิดพลาดการหารด้วยศูนย์อยู่ในสูตรนี้ แต่เนื่องจาก If ไม่ได้ใช้สาขานั้นเพราะ false, Power Fx และ Power Apps จะไม่รายงานข้อผิดพลาด:

ไม่มีแบนเนอร์ข้อผิดพลาดที่แสดงพร้อมกับฟังก์ชัน If ในคุณสมบัติ Text ของป้ายกำกับ

การใช้ฟังก์ชัน Set ที่มีข้อผิดพลาดจะไม่รายงานข้อผิดพลาดในจุดที่มีข้อผิดพลาดอยู่ในตัวแปร ตัวอย่างเช่น ใน Power Apps ต่อไปนี้เป็นสูตรใน App.OnStart ที่วางข้อผิดพลาดการหารด้วยศูนย์ลงในตัวแปร x:

ไม่มีแบนเนอร์แสดงข้อผิดพลาดพร้อมกับตั้งค่าการเรียกใช้ฟังก์ชันใน App.OnStart

ไม่มีการรายงานข้อผิดพลาด เนื่องจาก x ไม่ได้ถูกอ้างอิง อย่างไรก็ตาม เมื่อเราเพิ่มตัวควบคุม label และตั้งค่าคุณสมบัติ Text เป็น x ข้อผิดพลาดจะปรากฏขึ้น:

แบนเนอร์ข้อผิดพลาดที่แสดงด้วยตัวควบคุมป้ายกำกับที่อ้างอิงถึงตัวแปร x

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

การรายงานข้อผิดพลาด

หลังจากพบข้อผิดพลาด ขั้นตอนต่อไปคือการรายงานข้อผิดพลาดไปยังผู้ใช้ปลายทาง

ซึ่งต่างจาก Excel ตรงที่ไม่มีตำแหน่งที่สะดวกในการแสดงผลข้อผิดพลาดเสมอ เนื่องจากผลลัพธ์ของสูตรอาจทำให้คุณสมบัติ เช่น พิกัด X และ Y ของตัวควบคุมไม่มีตำแหน่งที่สะดวกในการแสดงข้อความ โฮสต์ Power Fx แต่ละตัวจะควบคุมวิธีแสดงข้อผิดพลาดต่อผู้ใช้ปลายทางในท้ายที่สุด และผู้สร้างจะควบคุมกระบวนการนี้มากน้อยเพียงใด ใน Power Apps แบนเนอร์ข้อผิดพลาดจะปรากฏขึ้นและ App.OnError จะถูกใช้เพื่อควบคุมวิธีการรายงานข้อผิดพลาด

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

ตัวแปรขอบเขต FirstError และ AllErrors ให้ข้อมูลบริบทเกี่ยวกับข้อผิดพลาดหรือข้อผิดพลาดต่างๆ ข้อมูลนี้ให้ข้อมูลเกี่ยวกับประเภทของข้อผิดพลาดและที่มาของข้อผิดพลาดและตำแหน่งที่พบข้อผิดพลาด

การหยุดทำงานหลังจากเกิดข้อผิดพลาด

สูตรลักษณะการทำงานสนับสนุนการดำเนินการ การแก้ไขฐานข้อมูล และการเปลี่ยนสถานะ สูตรเหล่านี้อนุญาตให้ดำเนินการมากกว่าหนึ่งรายการในลำดับโดยใช้ ; ตัวดำเนินการเชื่อมโยง (หรือ ;; ขึ้นอยู่กับตำแหน่งที่ตั้ง)

ตัวอย่างเช่น ในกรณีนี้ ตัวควบคุม grid กำลังแสดงสิ่งที่อยู่ในตาราง T การเลือกแต่ละปุ่มจะเปลี่ยนสถานะในตารางนี้ด้วยการเรียก Patch สองครั้ง:

ภาพเคลื่อนไหวแสดงสองเรกคอร์ดในตาราง T ที่อัปเดตด้วยตัวเลขสุ่ม หลังจากคลิกปุ่มแต่ละครั้ง

ในสูตรลักษณะการทำงานแบบลูกโซ่ การดำเนินการจะไม่หยุดหลังจากเกิดข้อผิดพลาดครั้งแรก มาแก้ไขตัวอย่างของเราเพื่อส่งหมายเลขดัชนีที่ไม่ถูกต้องในการเรียก Patch ครั้งแรก Patch ครั้งที่สองจะดำเนินต่อไปแม้ว่าจะมีข้อผิดพลาดก่อนหน้านี้ก็ตาม ข้อผิดพลาดแรกถูกรายงานไปยังผู้ใช้ปลายทาง และแสดงเป็นข้อผิดพลาดในสตูดิโอบนตัวควบคุม:

ภาพเคลื่อนไหวที่แสดงเฉพาะเรกคอร์โที่สองในตาราง T ที่ได้รับการปรับปรุงด้วยตัวเลขสุ่ม หลังจากการคลิกปุ่มแต่ละครั้ง เรกคอร์ดแรกทำให้เกิดข้อผิดพลาด

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

แอนิเมชั่นไม่แสดงการเปลี่ยนแปลงใดๆ ในเรกคอร์ดในตาราง T เนื่องจาก IfError ป้องกันไม่ให้การดำเนินการที่สองเสร็จสิ้นหลังจากเกิดข้อผิดพลาด

หากพบข้อผิดพลาดระหว่างการวนซ้ำหนึ่งครั้งของ 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 ) ) );

การทำงานกับข้อผิดพลาดหลายรายการ

เนื่องจากสูตรลักษณะการทำงานสามารถดำเนินการได้มากกว่าหนึ่งการกระทำ จึงอาจพบข้อผิดพลาดมากกว่าหนึ่งรายการได้เช่นกัน

ตามค่าเริ่มต้น ข้อผิดพลาดแรกจะถูกรายงานไปยังผู้ใช้ปลายทาง ในตัวอย่างนี้ การเรียก Patch ทั้งคู่จะล้มเหลว ครั้งที่สองมีข้อผิดพลาดการหารด้วยศูนย์ เฉพาะข้อผิดพลาดแรก (เกี่ยวกับดัชนี) เท่านั้นที่จะแสดงต่อผู้ใช้:

ข้อผิดพลาดดัชนีแรกที่แสดงในแบนเนอร์ข้อผิดพลาด ข้อผิดพลาดที่สองจะไม่ถูกรายงาน

ฟังก์ชัน IfError และ App.OnError สามารถเข้าถึงข้อผิดพลาดทั้งหมดที่พบกับตัวแปรขอบเขต AllErrors ในกรณีนี้ เราสามารถตั้งค่านี้เป็นตัวแปรส่วนกลางและดูข้อผิดพลาดทั้งสองที่พบ ข้อผิดพลาดจะปรากฏในตารางตามลำดับเดียวกันกับตอนที่พบ:

จับข้อผิดพลาดลงในตัวแปร PatchErrors ส่วนกลาง ซึ่งเราจะเห็นว่ามีข้อผิดพลาดทั้งสองอยู่

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

ตารางข้อผิดพลาด

อย่างที่เราเห็นก่อนหน้านี้ ข้อผิดพลาดสามารถเก็บไว้ในตัวแปรได้ ข้อผิดพลาดยังสามารถรวมอยู่ในโครงสร้างข้อมูล เช่น ตาราง นี่เป็นสิ่งสำคัญเพื่อให้ข้อผิดพลาดในเรกคอร์ดใดเรกคอร์ดหนึ่งไม่สามารถทำให้ทั้งตารางเป็นโมฆะได้

ตัวอย่างเช่น พิจารณาตัวควบคุม data table นี้ใน Power Apps:

ตารางข้อมูลแสดงข้อผิดพลาดสำหรับฟิลด์ Reciprocal สำหรับอินพุตเป็น 0 ซึ่งส่งผลให้เกิดข้อผิดพลาดในการหารด้วยศูนย์

การคำนวณใน AddColumns พบข้อผิดพลาดการหารด้วยศูนย์สำหรับค่าใดค่าหนึ่ง สำหรับเรกคอร์ดหนึ่งนั้น คอลัมน์ Reciprocal มีค่าข้อผิดพลาด (การหารด้วยศูนย์) แต่เรกคอร์ดอื่นๆ ไม่มี และใช้งานได้ IsError( Index( output, 2 ) ) ส่งคืนค่า false และ IsError( Index( output, 2 ).Value ) ส่งคืนค่า true

หากเกิดข้อผิดพลาดขึ้นเมื่อกรองตาราง เรกคอร์ดทั้งหมดจะเป็นข้อผิดพลาดแต่ยังคงส่งคืนในผลลัพธ์ เพื่อให้ผู้ใช้ทราบว่ามีบางอย่างอยู่ที่นั่นและมีปัญหา

ใช้ตัวอย่างนี้ ที่นี่ ตารางต้นฉบับไม่มีข้อผิดพลาด แต่การกรองจะสร้างข้อผิดพลาดเมื่อใดก็ตามที่ ค่า เท่ากับ 0:

ตารางข้อมูลแสดงข้อผิดพลาดสำหรับสองเรกคอร์ดที่ไม่สามารถประมวลผลตามเกณฑ์การกรอง

ค่า -5 และ -3 ถูกกรองออกอย่างเหมาะสม ค่า 0 ส่งผลให้เกิดข้อผิดพลาดในการประมวลผลตัวกรอง ดังนั้นจึงไม่ชัดเจนว่าควรรวมเรกคอร์ดไว้ในผลลัพธ์หรือไม่ เพื่อเพิ่มความโปร่งใสสูงสุดให้กับผู้ใช้ปลายทางและช่วยผู้สร้างแก้ไขจุดบกพร่อง เราได้รวมเรกคอร์ดข้อผิดพลาดแทนต้นฉบับ ในกรณีนี้ IsError( Index( output, 2 ) ) ส่งคืนเป็นจริง

ข้อผิดพลาดของแหล่งข้อมูล

ฟังก์ชันที่ปรับเปลี่ยนข้อมูลในแหล่งข้อมูล เช่น Patch, Collect, Remove, RemoveIf, Update, UpdateIf และ SubmitForm จะรายงานข้อผิดพลาดสองแบบ:

  • แต่ละฟังก์ชันเหล่านี้จะส่งคืนค่าข้อผิดพลาดเป็นผลลัพธ์ของการดำเนินการ ตรวจพบข้อผิดพลาดได้ด้วย IsError และมีการแทนที่หรือระงับด้วย IfError และ App.OnError ตามปกติ
  • หลังจากการดำเนินการ ฟังก์ชัน Errors จะส่งคืนข้อผิดพลาดสำหรับการดำเนินการก่อนหน้านี้ด้วย ซึ่งจะมีประโยชน์สำหรับการแสดงข้อความแสดงข้อผิดพลาดบนหน้าจอแบบฟอร์มโดยไม่จำเป็นต้องจับภาพข้อผิดพลาดในตัวแปรสถานะ

ตัวอย่างเช่น สูตรนี้จะตรวจหาข้อผิดพลาดจาก Collect และแสดงข้อความแสดงข้อผิดพลาดที่กำหนดเอง:

IfError( Collect( Names, { Name: "duplicate" } ),
         Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )

ฟังก์ชัน Errors ยังส่งคืนข้อมูลเกี่ยวกับข้อผิดพลาดที่ผ่านมาระหว่างการดำเนินการรันไทม์ด้วย ซึ่งจะมีประโยชน์สำหรับการแสดงข้อผิดพลาดบนหน้าจอแบบฟอร์มโดยไม่จำเป็นต้องจับภาพข้อผิดพลาดในตัวแปรสถานะ

การส่งข้อผิดพลาดอีกครั้ง

บางครั้งอาจมีข้อผิดพลาดที่อาจเกิดขึ้นและสามารถเพิกเฉยได้อย่างปลอดภัย ภายใน IfError และ App.OnError หากตรวจพบข้อผิดพลาดที่ควรส่งต่อไปยังตัวจัดการที่สูงกว่าถัดไป สามารถส่งส่งอีกครั้งด้วย Error( AllErrors )

สร้างข้อผิดพลาดของคุณเอง

คุณยังสามารถสร้างข้อผิดพลาดของคุณเองได้ด้วยฟังก์ชัน Error

หากคุณสร้างข้อผิดพลาดของคุณเอง ขอแนะนำให้คุณใช้ค่าที่สูงกว่า 1,000 เพื่อหลีกเลี่ยงความขัดแย้งที่อาจเกิดขึ้นกับค่าข้อผิดพลาดของระบบในอนาคต

ค่า ErrorKind enum

ErrorKind enum มูลค่า รายละเอียด
AnalysisError 18 ข้อผิดพลาดของระบบ มีปัญหากับการวิเคราะห์ของคอมไพเลอร์
BadLanguageCode 14 มีการใช้รหัสภาษาที่ไม่ถูกต้องหรือไม่รู้จัก
BadRegex 15 นิพจน์ปกติที่ไม่ถูกต้อง ตรวจสอบไวยากรณ์ที่ใช้กับฟังก์ชัน IsMatch, Match หรือ MatchAll
ข้อขัดแย้ง 6 เรกคอร์ดที่กำลังอัปเดตมีการเปลี่ยนแปลงที่ต้นทางแล้ว และข้อขัดแย้งจำเป็นต้องได้รับการแก้ไข วิธีแก้ปัญหาทั่วไปคือบันทึกการเปลี่ยนแปลงในเครื่อง รีเฟรชเรกคอร์ด และนำการเปลี่ยนแปลงไปใช้ใหม่
ConstraintViolated 8 เรกคอร์ดไม่ผ่านการตรวจสอบข้อจำกัดบนเซิร์ฟเวอร์
CreatePermission 3 ผู้ใช้ไม่มีสิทธิ์ในการสร้างเรกคอร์ดสำหรับแหล่งข้อมูล ตัวอย่างเช่น มีการเรียกฟังก์ชัน Collect
DeletePermissions 5 ผู้ใช้ไม่มีสิทธิ์ในการลบเรกคอร์ดสำหรับแหล่งข้อมูล ตัวอย่างเช่น มีการเรียกฟังก์ชัน Remove
Div0 13 การหารด้วยศูนย์
EditPermissions 4 ผู้ใช้ไม่มีสิทธิ์ในการสร้างเรกคอร์ดสำหรับแหล่งข้อมูล ตัวอย่างเช่น มีการเรียกฟังก์ชัน Patch
GeneratedValue 9 ค่าถูกส่งไปยังเซิร์ฟเวอร์อย่างไม่ถูกต้องสำหรับฟิลด์ที่เซิร์ฟเวอร์คำนวณโดยอัตโนมัติ
InvalidFunctionUsage 16 การใช้ฟังก์ชันไม่ถูกต้อง บ่อยครั้งที่อาร์กิวเมนต์ของฟังก์ชันอย่างน้อยหนึ่งรายการไม่ถูกต้องหรือใช้ในลักษณะที่ไม่ถูกต้อง
FileNotFound 17 ไม่พบที่เก็บข้อมูล SaveData
InsufficientMemory 21 มีหน่วยความจำหรือที่เก็บข้อมูลบนอุปกรณ์ไม่เพียงพอสำหรับการดำเนินการ
InvalidArgument 25 อาร์กิวเมนต์ที่ไม่ถูกต้องถูกส่งผ่านไปยังฟังก์ชัน
ภายใน 26 ข้อผิดพลาดของระบบ มีปัญหาภายในกับฟังก์ชันใดฟังก์ชันหนึ่ง
MissingRequired 2 ฟิลด์ที่จำเป็นของเรกคอร์ดขาดหายไป
เครือข่าย 23 มีปัญหาเกิดขึ้นกับการสื่อสารของเครือข่าย
None 12 ข้อผิดพลาดของระบบ ไม่มีข้อผิดพลาด
ไม่สามารถใช้งานได้ 27 ไม่มีค่า มีประโยชน์ในการแยกความแตกต่างของค่า ว่าง ที่สามารถถือเป็นศูนย์ในการคำนวณตัวเลขจากค่าว่างที่ควรตั้งค่าสถานะว่าเป็นปัญหาที่อาจเกิดขึ้นหากใช้ค่านั้น
NotFound 7 ไม่พบเรกคอร์ด ตัวอย่างเช่น เรกคอร์ดที่จะแก้ไขในฟังก์ชัน Patch
NotSupported 20 การดำเนินการไม่ได้รับการสนับสนุนโดยเครื่องเล่นหรืออุปกรณ์นี้
ตัวเลข 24 มีการใช้ฟังก์ชันตัวเลขในลักษณะที่ไม่เหมาะสม ตัวอย่างเช่น Sqrt ที่มี -1.
QuoteExceeded 22 เกินโควตาที่เก็บข้อมูล
ReadOnlyValue 10 คอลัมน์เป็นแบบอ่านอย่างเดียวและไม่สามารถแก้ไขได้
ReadPermission 19 ผู้ใช้ไม่มีสิทธิ์ในการอ่านเรกคอร์ดสำหรับแหล่งข้อมูล
ซิงค์ 1 มีการรายงานข้อผิดพลาดโดยแหล่งข้อมูล ตรวจสอบคอลัมน์ข้อความสำหรับข้อมูลเพิ่มเติม
ไม่รู้จัก 12 เกิดข้อผิดพลาดขึ้น แต่เป็นชนิดที่ไม่รู้จัก
การตรวจสอบความถูกต้อง 11 เรกคอร์ดไม่ผ่านการตรวจสอบความถูกต้อง