Pengendalian ralat

Tingkah laku yang diterangkan dalam artikel ini hanya tersedia apabila ciri pengurusan ralat peringkat formula dihidupkan.

Power Fx menyokong pengendalian ralat peringkat formula. Ciri ini dihidupkan secara lalai untuk semua apl baharu. Walau bagaimanapun, sesetengah apl lama mungkin mematikannya dalam Tetapan apl. Pastikan ciri ini dihidupkan.

  1. Buka apl kanvas dalam mod edit.
  2. Pergi ketab Kemas Kini Tetapan>>Bersara.
  3. Pastikan Lumpuhkan pengurusan peringkat formula dimatikan.

Untuk maklumat lanjut, lihat Mengawal ciri yang didayakan.

Ralat berlaku. Rangkaian menurun, storan penuh, nilai yang tidak dijangka mengalir masuk. Penting untuk logik anda terus berfungsi dengan betul dalam menghadapi isu yang berpotensi.

Secara lalai, ralat mengalir melalui formula aplikasi dan dilaporkan kepada pengguna akhir aplikasi tersebut. Dengan cara ini, pengguna akhir tahu sesuatu yang tidak dijangka berlaku. Mereka berpotensi menyelesaikan masalah itu sendiri dengan input yang berbeza, atau mereka boleh melaporkan masalah itu kepada pemilik apl.

Sebagai pembuat apl, kawal ralat dalam apl anda:

  • Mengesan dan mengendalikan ralat. Jika terdapat kemungkinan ralat mungkin berlaku, tulis formula apl untuk mengesan keadaan ralat dan cuba semula operasi. Pengguna akhir tidak perlu bimbang bahawa ralat berlaku kerana pembuat mengambil kira kemungkinan itu. Tangkap ralat dengan menggunakan fungsi IfError, IsError dan IsErrorOrBlank dalam formula.
  • Laporkan ralat. Jika ralat tidak dikendalikan dalam formula yang anda temui, ralat menggelembung sehingga pengendali App.OnError . Anda tidak boleh menggantikan ralat kerana ia telah berlaku dan merupakan sebahagian daripada pengiraan formula. Tetapi anda boleh menggunakan App.OnError untuk mengawal cara ralat dilaporkan kepada pengguna akhir, termasuk menyekat pelaporan ralat itu sekali. App.OnError juga menyediakan titik tercekik biasa untuk pelaporan ralat merentas keseluruhan apl.
  • Buat dan buang semula ralat. Akhir sekali, anda mungkin mengesan keadaan ralat dengan logik anda sendiri, syarat yang khusus untuk apl anda. Gunakan fungsi Error untuk mencipta ralat tersuai. Gunakan fungsi Ralat untuk membuang semula ralat selepas disoal siasat dalam IfError atau App.OnError.

Mari bermula

Mari kita mulakan dengan contoh mudah.

  1. Cipta skrin baharu dalam aplikasi Power Apps Canvas.
  2. Masukkan kawalan TextInput. Ia lalai kepada nama TextInput1.
  3. Sisipkan kawalan Label.
  4. Tetapkan sifat Text bagi kawalan Label kepada formula
1/Value( TextInput1.Text )

Tangkapan skrin sepanduk ralat yang dipaparkan dengan 'nilai tidak boleh ditukar kepada nombor' untuk kawalan input teks yang mengandungi 'Input teks'.

Anda melihat ralat kerana teks lalai kawalan TextInput ialah "Text input", yang tidak boleh ditukar kepada nombor. Secara lalai ini adalah perkara yang baik: pengguna akhir mendapat pemberitahuan bahawa sesuatu tidak berfungsi seperti yang diharapkan dalam apl.

Jelas sekali, anda tidak mahu ralat menyambut pengguna setiap kali mereka memulakan apl ini. Mungkin "Text input" bukan lalai yang betul untuk kotak input teks. Untuk menyelesaikan masalah ini, tukar sifat Lalai kawalan TextInput kepada:

Blank()

Tangkapan skrin sepanduk ralat dipaparkan dengan 'pembahagian mengikut sifar'.

Hmm, sekarang anda melihat ralat yang berbeza. Operasi matematik dengan kosong, seperti pembahagian, memaksa nilai kosong kepada sifar. Nilai itu menyebabkan pembahagian dengan ralat sifar. Untuk menyelesaikan masalah ini, anda perlu memutuskan tingkah laku yang sesuai untuk situasi ini dalam apl ini. Jawapannya mungkin untuk menunjukkan kosong apabila input teks kosong. Anda boleh mencapai matlamat ini dengan membungkus formula anda dengan fungsi IfError :

IfError( 1/Value( TextInput1.Text ), Blank() )

Tangkapan skrin menunjukkan tiada sepanduk ralat dipaparkan, ralat disebabkan oleh nilai kosong telah digantikan dengan kosong.

Kini ralat digantikan dengan nilai yang sah dan sepanduk ralat hilang. Tetapi, anda mungkin telah melampaui batas, IfError yang anda gunakan merangkumi semua ralat, termasuk menaip nilai buruk seperti "hello". Anda boleh menangani masalah ini dengan menala IfError anda untuk mengendalikan pembahagian mengikut kes sifar sahaja dan membuang semula semua ralat lain:

IfError( 1/Value( TextInput1.Text ), 
         If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )

Tangkapan skrin menunjukkan tiada sepanduk ralat dipaparkan, ralat yang disebabkan secara khusus oleh pembahagian dengan sifar telah digantikan dengan kosong, jika tidak, ralat itu dilemparkan semula.

Jadi, jalankan apl anda dan cuba beberapa nilai yang berbeza.

Tanpa sebarang nilai, apabila aplikasi dimulakan, tiada jawapan dipaparkan kerana nilai lalai ialah blank, tetapi juga tiada ralat ditunjukkan kerana IfError menggantikan ralat pembahagian dengan sifar.

Tangkapan skrin menunjukkan tiada jawapan dipaparkan dan tiada sepanduk ralat.

Jika anda menaip 4, anda mendapat hasil yang dijangkakan 0.25:

Tangkapan skrin menunjukkan 0.25 dipaparkan dan tiada sepanduk ralat.

Dan jika anda menaip sesuatu yang menyalahi undang-undang, seperti hello, maka anda menerima sepanduk ralat:

Tangkapan skrin menunjukkan tiada nilai dipaparkan dan sepanduk ralat ditunjukkan kerana ketidakupayaan untuk menukar 'hello' kepada nombor.

Ini ialah contoh pengenalan yang mudah. Anda boleh mengendalikan ralat dalam pelbagai cara, bergantung pada keperluan apl:

  1. Daripada sepanduk ralat, anda boleh menunjukkan "#Error" dalam kawalan label dengan formula. Untuk memastikan jenis penggantian serasi dengan argumen pertama kepada IfError, anda perlu menukar hasil berangka secara eksplisit kepada rentetan teks dengan menggunakan fungsi Teks .
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Tangkapan skrin menunjukkan tiada sepanduk ralat dan sebaliknya #Error ditunjukkan sebagai hasilnya.
  2. Daripada membungkus tika khusus ini dengan IfError, anda boleh menulis pengendali App.OnError berpusat. Anda tidak boleh menggantikan rentetan yang ditunjukkan dengan "#Error" kerana ralat telah berlaku dan App.OnError hanya disediakan untuk mengawal pelaporan.
    If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
    

Penyebaran ralat

Ralat mengalir melalui formula sama seperti yang berlaku dalam Excel. Sebagai contoh, dalam Excel, jika sel A1 mempunyai formula =1/0, maka A1 memaparkan nilai #DIV0!ralat:

Tangkapan skrin hamparan Excel dengan A1=1/0 dan #DIV/0! ditunjukkan dalam sel.

Jika sel A2 merujuk kepada A1 dengan formula seperti =A1*2, ralat merambat melalui formula itu juga:

Tangkapan skrin hamparan Excel dengan A2=A1*2 dan #DIV/0! ditunjukkan dalam sel.

Ralat menggantikan nilai yang sebaliknya akan dikira oleh formula. Tiada hasil untuk pendaraban dalam sel A2, hanya ralat daripada pembahagian dalam A1.

Power Fx berfungsi dengan cara yang sama. Secara umum, jika anda memberikan ralat sebagai hujah kepada fungsi atau pengendali, operasi tidak berlaku. Ralat input mengalir melalui hasil daripada operasi. Sebagai contoh, Mid( Text( 1/0 ), 1, 1 ) mengembalikan ralat Pembahagian mengikut Sifar, kerana ralat paling dalam melalui fungsi Teks dan fungsi Pertengahan:

Tangkapan skrin sepanduk ralat yang menunjukkan operasi tidak sah: pembahagian dengan sifar.

Secara umum, ralat tidak mengalir melalui sifat kawalan Power Apps. Mari lanjutkan contoh sebelumnya dengan kawalan lain yang memaparkan jika sifat label Text pertama ialah keadaan ralat:

Tangkapan skrin menunjukkan tiada ralat ditunjukkan pada kawalan label kedua.

Tidak mengapa ralat tidak menyebar melalui kawalan kerana sistem memerhatikan ralat pada input kepada semua sifat kawalan. Ralat itu tidak hilang.

Kebanyakan fungsi dan pengendali mengikut peraturan "ralat masuk, ralat keluar", tetapi terdapat beberapa pengecualian. Fungsi IsError, IsErrorOrBlank dan IfError direka bentuk untuk bekerja dengan ralat, jadi ia mungkin tidak mengembalikan ralat walaupun satu dihantar ke dalamnya.

Memerhati ralat

Power Fx tidak memerhatikan ralat sehingga formula menggunakan nilai ralat.

Akibatnya, fungsi Jika dan Pilih mungkin tidak mengembalikan ralat jika satu dihantar. Pertimbangkan formula If( false, 1/0, 3 ). Terdapat pembahagian mengikut ralat sifar yang terdapat dalam formula ini, tetapi memandangkan fungsi If tidak mengambil cawangan itu kerana keadaan false, Power Fx dan Power Apps tidak melaporkan ralat:

Tangkapan skrin menunjukkan tiada sepanduk ralat yang ditunjukkan dengan fungsi If dalam label Sifat teks.

Menggunakan fungsi Set dengan ralat tidak melaporkan ralat pada titik ralat diletakkan ke dalam pembolehubah. Contohnya dalam Power Apps, berikut ialah formula dalam App.OnStart yang meletakkan pembahagian mengikut ralat sifar ke dalam pembolehubah x:

Tangkapan skrin menunjukkan tiada sepanduk ralat yang ditunjukkan dengan Tetapkan panggilan fungsi dalam App.OnStart.

Tiada ralat dilaporkan kerana x tidak dirujuk. Walau bagaimanapun, sebaik sahaja anda menambah kawalan label dan mengesetkan sifat Teksnya kepada x, ralat dipaparkan:

Tangkapan skrin menunjukkan sepanduk ralat ditunjukkan dengan kawalan label merujuk kepada pembolehubah x.

Anda boleh memerhatikan ralat dalam formula dengan menggunakan fungsi IfError, IsError dan IsErrorOrBlank . Dengan menggunakan fungsi ini, anda boleh mengembalikan nilai alternatif, mengambil tindakan alternatif atau mengubah suai ralat sebelum ia diperhatikan dan dilaporkan.

Melaporkan ralat

Selepas Power Fx memerhatikan ralat, langkah seterusnya ialah melaporkan ralat itu kepada pengguna akhir.

Tidak seperti Excel, tidak selalu ada tempat yang sesuai untuk menunjukkan hasil ralat, kerana hasil formula mungkin memacu sifat seperti koordinat X dan Y kawalan yang tidak ada tempat yang sesuai untuk menunjukkan beberapa teks. Setiap hos Power Fx mengawal cara ralat akhirnya dipaparkan kepada pengguna akhir dan sejauh mana kawalan yang dimiliki oleh pembuat ke atas proses ini. Dalam Power Apps, sepanduk ralat ditunjukkan dan App.OnError digunakan untuk mengawal cara ralat dilaporkan.

Anda perlu ambil perhatian bahawa App.OnError tidak boleh menggantikan ralat dengan cara yang sama seperti yang IfError boleh lakukan. Pada ketika App.OnError dilaksanakan, ralat telah berlaku dan hasilnya disebarkan melalui formula lain. App.OnError hanya mengawal cara ralat dilaporkan kepada pengguna akhir dan menyediakan cangkuk untuk pembuat mencatat ralat jika dikehendaki.

Skop pemboleh ubah FirstError dan AllErrors memberikan maklumat konteks tentang ralat atau ralat-ralat. Konteks ini memberikan maklumat tentang jenis ralat, di mana ralat itu berasal, dan di mana ia diperhatikan.

Berhenti selepas ralat

Formula tingkah laku menyokong pengambilan tindakan, pengubahsuaian pangkalan data dan penukaran keadaan. Formula ini membenarkan lebih daripada satu tindakan dilakukan dalam urutan dengan menggunakan ; pengendali rantaian (atau ;; bergantung pada tempatan).

Dalam kes ini, sebagai contoh, kawalan grid menunjukkan apa yang ada dalam T jadual. Setiap butang pilih mengubah keadaan dalam jadual ini dengan dua panggilan Patch:

Tangkapan skrin animasi yang menunjukkan kedua-dua rekod dalam jadual T dikemas kini dengan nombor rawak selepas setiap klik butang.

Dalam formula tingkah laku berantai, tindakan tidak berhenti selepas ralat pertama. Mari ubah suai contoh kita untuk menghantar nombor indeks yang tidak sah dalam panggilan Patch pertama. Patch kedua diteruskan walaupun terdapat ralat yang lebih awal ini. Ralat pertama dilaporkan kepada pengguna akhir dan ditunjukkan sebagai ralat dalam Studio pada kawalan:

Tangkapan skrin animasi yang menunjukkan hanya rekod kedua dalam jadual T dikemas kini dengan nombor rawak selepas setiap klik butang, rekod pertama mengakibatkan ralat.

Gunakan IfError untuk menghentikan pelaksanaan selepas ralat. Sama seperti fungsi If, argumen ketiga untuk fungsi ini menyediakan tempat untuk meletakkan tindakan yang perlu dilaksanakan hanya jika tiada ralat:

Tangkapan skrin animasi menunjukkan tiada perubahan pada mana-mana rekod dalam jadual T, kerana IfError menghalang operasi kedua daripada diselesaikan selepas ralat.

Jika ralat ditemui semasa salah satu lelaran ForAll, lelaran yang lain tidak berhenti. ForAll direka bentuk untuk melaksanakan setiap lelaran secara bebas, membolehkan pelaksanaan selari. Apabila ForAll selesai, ralat dikembalikan, yang mengandungi semua ralat yang dihadapi (dengan memeriksa AllErrors dalam IfError atau App.OnError).

Sebagai contoh, formula berikut menghasilkan ForAll mengembalikan dua ralat (untuk pembahagian dengan sifar untuk Value 0, dua kali) dan Collection mempunyai tiga rekod (untuk apabila Value bukan 0): [1, 2, 3].

Clear( Collection ); 
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );

Bekerja dengan pelbagai ralat

Oleh kerana formula tingkah laku boleh melaksanakan lebih daripada satu tindakan, ia juga boleh menemui lebih daripada satu ralat.

Secara lalai, apl melaporkan ralat pertama kepada pengguna akhir. Dalam contoh ini, kedua-dua panggilan Tampalan gagal, tetapi panggilan kedua gagal dengan pembahagian mengikut ralat sifar. Pengguna hanya melihat ralat pertama tentang indeks:

Tangkapan skrin ralat indeks pertama dipaparkan dalam sepanduk ralat, ralat kedua tidak dilaporkan.

Fungsi IfError dan App.OnError boleh mengakses semua ralat yang dihadapi dengan menggunakan pembolehubah skop AllErrors. Dalam kes ini, anda boleh menetapkan pembolehubah ini kepada pembolehubah global dan melihat kedua-dua ralat yang dihadapi. Ia muncul dalam jadual dalam susunan yang sama di tempat ia ditemui:

Tangkapan skrin tangkapan ralat ke dalam pembolehubah global PatchErrors di mana kita dapat melihat bahawa kedua-dua ralat hadir.

Formula bukan tingkah laku juga boleh mengembalikan berbilang ralat. Contohnya, menggunakan fungsi Patch dengan sekumpulan rekod untuk dikemas kini boleh mengembalikan berbilang ralat, satu untuk setiap rekod yang gagal.

Ralat dalam jadual

Seperti yang anda lihat sebelum ini, anda boleh menyimpan ralat dalam pembolehubah. Anda juga boleh memasukkan ralat dalam struktur data, seperti jadual. Pendekatan ini penting kerana ia memastikan bahawa ralat pada mana-mana satu rekod tidak boleh membatalkan keseluruhan jadual.

Sebagai contoh, pertimbangkan kawalan jadual data ini dalam Power Apps:

Tangkapan skrin jadual data yang menunjukkan ralat untuk medan Timbal balik untuk input 0, yang mengakibatkan pembahagian dengan ralat sifar.

Pengiraan dalam AddColumns menemui pembahagian mengikut ralat sifar untuk salah satu nilai. Untuk satu rekod itu, lajur Timbal balik mempunyai nilai ralat (pembahagian dengan sifar) tetapi rekod lain tidak dan dalam keadaan baik. IsError( Index( output, 2 ) ) mengembalikan palsu dan IsError( Index( output, 2 ).Value ) mengembalikan benar.

Jika ralat berlaku semasa menapis jadual, keseluruhan rekod adalah ralat. Operasi masih mengembalikan rekod dalam hasil supaya pengguna akhir tahu ada sesuatu di sana dan terdapat masalah.

Ambil contoh ini. Di sini, jadual asal tidak mempunyai ralat, tetapi tindakan menapis menghasilkan ralat apabila Nilai bersamaan dengan 0:

Tangkapan skrin jadual data yang menunjukkan ralat untuk dua rekod yang tidak dapat diproses oleh kriteria Penapis.

Nilai -5 dan -3 ditapis dengan betul. Nilai 0 menyebabkan ralat dalam pemprosesan penapis, jadi tidak jelas sama ada rekod itu perlu disertakan atau tidak dalam hasil. Untuk memaksimumkan ketelusan untuk pengguna akhir dan membantu pembuat nyahpepijat, operasi termasuk rekod ralat sebagai ganti yang asal. Dalam kes ini, IsError( Index( output, 2 ) ) mengembalikan benar.

Ralat sumber data

Fungsi yang mengubah suai data dalam sumber data, seperti Patch, Collect, Remove, RemoveIf, Update, UpdateIf dan SubmitForm melaporkan ralat dalam dua cara:

  • Setiap fungsi ini mengembalikan nilai ralat hasil daripada operasi. Anda boleh mengesan ralat dengan menggunakan IsError dan menggantikan atau menyekat ralat dengan menggunakan IfError dan App.OnError seperti biasa.
  • Selepas operasi, fungsi Ralat juga mengembalikan ralat untuk operasi sebelumnya. Tingkah laku ini boleh berguna untuk memaparkan mesej ralat pada skrin borang tanpa perlu menangkap ralat dalam pembolehubah keadaan.

Contohnya, formula ini menyemak ralat daripada Kumpulkan dan memaparkan mesej ralat tersuai:

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

Fungsi Errors juga mengembalikan maklumat tentang ralat lalu semasa operasi masa jalanan. Ia boleh berguna untuk memaparkan ralat pada skrin borang tanpa perlu merekodkan ralat dalam pemboleh ubah keadaan.

Melempar semula ralat

Kadangkala anda menjangkakan kemungkinan kesilapan dan boleh mengabaikannya dengan selamat. Di dalam IfError dan App.OnError, jika ralat dikesan yang harus dihantar kepada pengendali yang lebih tinggi seterusnya, buang semula dengan menggunakan Error( AllErrors ).

Mencipta ralat anda sendiri

Anda juga boleh membuat ralat anda sendiri dengan menggunakan fungsi Ralat .

Jika anda mencipta ralat anda sendiri, gunakan nilai yang lebih besar daripada 1,000 untuk mengelakkan potensi konflik dengan nilai ralat sistem masa hadapan.

Nilai ErrorKind enum

Enum ErrorKind Nilai Description
AnalysisError 18 Ralat sistem. Terdapat masalah dengan analisis pengkompilasi.
BadLanguageCode 14 Kod bahasa yang tidak sah atau tidak dikenali telah digunakan.
BadRegex 15 Ungkapan biasa tidak sah. Semak sintaks yang digunakan dengan fungsi IsMatch, Match atau MatchAll.
Konflik 6 Rekod yang anda kemas kini telah diubah pada sumber dan anda perlu menyelesaikan konflik. Penyelesaian biasa ialah menyimpan sebarang perubahan setempat, segar semula rekod dan mengenakan semula perubahan.
ConstraintViolated 8 Rekod tidak menghantar semakan kekangan pada pelayan.
CreatePermission 3 Anda tidak mempunyai keizinan untuk mencipta rekod bagi sumber data. Sebagai contoh, fungsi Collect telah dipanggil.
DeletePermissions 5 Anda tidak mempunyai keizinan untuk memadamkan rekod untuk sumber data. Sebagai contoh, fungsi Remove telah dipanggil.
Div0 13 Pembahagian dengan sifar.
EditPermissions 4 Anda tidak mempunyai keizinan untuk mencipta rekod bagi sumber data. Sebagai contoh, fungsi Patch telah dipanggil.
GeneratedValue 9 Nilai telah tersilap dihantar kepada pelayan untuk medan yang dikira secara automatik oleh pelayan.
InvalidFunctionUsage 16 Penggunaan fungsi yang tidak sah. Selalunya satu atau lebih argumen kepada fungsi tidak betul atau digunakan dengan cara yang tidak sah.
FileNotFound 17 Storan SaveData tidak ditemui.
InsufficientMemory 21 Tidak ada memori atau storan yang mencukupi pada peranti untuk operasi.
InvalidArgument 25 Argumen tidak sah telah dihantar ke fungsi.
Internal 26 Ralat sistem. Terdapat masalah dalaman dengan salah satu fungsi.
MissingRequired 2 Medan rekod yang diperlukan tiada.
Network 23 Terdapat masalah dengan komunikasi rangkaian.
None 0 Ralat sistem. Tiada ralat.
NotApplicable 27 Tiada nilai tersedia. Ralat ini berguna untuk membezakan nilai kosong yang boleh dianggap sebagai sifar dalam pengiraan berangka, daripada nilai kosong yang harus dibenderakan sebagai masalah yang berpotensi jika nilai digunakan.
NotFound 7 Rekod tidak ditemukan. Sebagai contoh, rekod yang akan diubah suai dalam fungsi Patch.
NotSupported 20 Operasi tidak disokong oleh pemain atau peranti ini.
Numeric 24 Fungsi berangka telah digunakan dengan cara yang tidak betul. Sebagai contoh, Sqrt dengan -1.
QuoteExceeded 22 Kuota storan melebihi.
ReadOnlyValue 10 Lajur adalah baca sahaja dan tidak boleh diubah suai.
ReadPermission 19 Anda tidak mempunyai keizinan untuk membaca rekod untuk sumber data.
Sync 1 Sumber data melaporkan ralat. Semak lajur Mesej untuk maklumat lanjut.
Tidak diketahui 12 Terdapat ralat, tetapi tidak diketahui jenis.
Pengesahan 11 Rekod tidak menghantar semakan pensahihan.