Kongsi melalui


Pengendalian ralat

Nota

Tingkah laku yang diterangkan oleh artikel ini hanya tersedia apabila ciri pratonton Pengurusan ralat peringkat formula melalui Tetapan>Ciri akan datang>Pratonton dihidupkan. Maklumat lanjut: 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 telah berlaku, mereka berpotensi menyelesaikan masalah itu sendiri dengan input yang berbeza, atau mereka boleh melaporkan masalah itu kepada pemilik aplikasi.

Sebagai pembuat aplikasi, anda boleh mengawal ralat dalam aplikasi anda:

  • Mengesan dan mengendalikan ralat. Jika terdapat kemungkinan ralat mungkin berlaku, formula aplikasi boleh ditulis untuk mengesan keadaan ralat dan cuba semula operasi. Pengguna akhir tidak perlu bimbang bahawa ralat berlaku kerana pembuat mengambil kira kemungkinan itu. Ini dilakukan dengan fungsi IfError, IsError dan IsErrorOrBlank dalam formula.
  • Melaporkan ralat. Jika ralat tidak dikendalikan dalam formula ia ditemukan, ralat itu kemudiannya akan muncul pada pengendali App.OnError . Di sini, ralat tidak lagi boleh diganti 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 cekik biasa untuk pelaporan ralat pada keseluruhan aplikasi.
  • Mencipta dan melempar semula ralat. Akhir sekali, anda boleh mengesan keadaan ralat dengan logik anda sendiri, keadaan yang khusus untuk aplikasi anda. Gunakan fungsi Error untuk mencipta ralat tersuai. Fungsi Error juga digunakan untuk melempar semula ralat selepas mendapat data daripadanya dalam IfError atau App.OnError.

Untuk Bermula

Mari kita mulakan dengan contoh mudah.

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

Sepanduk ralat yang dipaparkan dengan

Kita mendapat ralat kerana teks lalai bagi kawalan TextInput ialah "Text input", yang tidak boleh ditukar kepada nombor. Secara lalai ini satu perkara yang baik: pengguna akhir akan mendapatkan pemberitahuan bahawa sesuatu tidak berfungsi seperti yang diharapkan dalam aplikasi.

Jelas sekali, kami tidak mahu ralat menyapa pengguna setiap kali mereka memulakan aplikasi ini. Mungkin "Text input" bukan lalai yang betul untuk kotak input teks. Untuk membetulkan perkara ini, mari tukar sifat Default bagi kawalan TextInput kepada:

Blank()

Sepanduk ralat dipaparkan dengan

Hmm, sekarang kita ada ralat yang berbeza. Operasi matematik dengan blank, seperti bahagi, akan memberikan nilai kosong kepada sifar. Tindakan itu sekarang menyebabkan ralat pembahagian dengan sifar. Untuk membetulkan perkara ini, kita perlu menentukan tingkah laku yang sesuai untuk situasi ini dalam aplikasi ini. Jawapannya mungkin dengan menunjukkan blank apabila input teks ialah blank. Kita boleh mencapainya dengan membalut formula kita dengan fungsi IfError:

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

Tiada sepanduk ralat dipaparkan, ralat kerana nilai kosong telah digantikan dengan kosong

Sekarang ralat digantikan dengan nilai yang sah dan sepanduk ralat telah hilang. Tetapi, kita mungkin telah terlebih sasar, IfError yang kita gunakan merangkumi semua ralat, termasuk menaip nilai yang buruk seperti "hello". Kita boleh menangani perkara ini dengan menala IfError kita untuk mengendalikan pembahagian dengan kes sifar sahaja dengan dan melempar semula semua ralat lain:

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

Tiada sepanduk ralat yang dipaparkan, ralat yang disebabkan secara khusus kepada pembahagian dengan sifar telah digantikan dengan kosong, jika tidak, ralat dilemparkan semula

Jadi, mari kita jalankan aplikasi kita 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.

Tiada jawapan dipaparkan dan tiada sepanduk ralat

Jika kita menaip masuk 4, kita mendapat hasil yang dijangkakan sebanyak 0.25:

0.25 Dipaparkan dan tiada sepanduk ralat

Jika kita menaip masuk sesuatu yang tidak sah, seperti hello, maka kita akan menerima sepanduk ralat:

Tiada nilai yang dipaparkan dan sepanduk ralat yang ditunjukkan untuk ketidakupayaan untuk menukar

Ini ialah contoh pengenalan yang mudah. Pengendalian ralat boleh dilakukan dengan pelbagai cara, bergantung pada keperluan aplikasi:

  1. Daripada sepanduk ralat, kita boleh menunjukkan "#Error" dalam kawalan label dengan formula. Untuk memastikan jenis penggantian serasi dengan argumen pertama kepada IfError kita perlu menukar hasil berangka dengan jelas kepada rentetan teks dengan fungsi Text.
    IfError( Text( 1/Value( TextInput1.Text ) ), 
             If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
    
    Tiada sepanduk ralat dan sebaliknya #Error ditunjukkan sebagai hasilnya
  2. Daripada membalut tika khusus ini dengan IfError kita boleh menulis pengendali App.OnError berpusat. Kita 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 akan memaparkan nilai ralat #DIV0!:

Hamparan Excel dengan A1 = 1/0 dan #DIV/0! ditunjukkan dalam sel

Jika sel A2 merujuk pada A1 dengan formula seperti =A1*2, maka ralat tersebar melalui formula itu juga:

Hamparan Excel dengan A2=A1*2 dan #DIV/0! ditunjukkan dalam sel

Ralat itu menggantikan nilai yang sepatutnya dikira. Tiada hasil untuk pendaraban dalam sel A2, hanya ralat daripada pembahagian dalam A1.

Power Fx berfungsi dengan cara yang sama. Secara amnya, jika ralat diberikan sebagai argumen kepada fungsi atau pengendali, operasi tidak akan berlaku dan ralat input akan mengalir sebagai hasil daripada operasi. Sebagai contoh, Mid( Text( 1/0 ), 1, 1 ) akan mengembalikan ralat Pembahagian dengan Sifar, kerana ralat paling dalam diturunkan melalui fungsi Text dan fungsi Mid:

Sepanduk ralat menunjukkan operasi tidak sah: pembahagian mengikut sifar

Secara amnya, ralat tidak mengalir melalui sifat kawalan Power Apps. Mari kembangkan contoh sebelumnya dengan kawalan tambahan yang dipaparkan jika sifat Text label pertama ialah keadaan ralat:

Tiada ralat ditunjukkan pada kawalan label kedua

Tidak mengapa ralat tidak disebarkan melalui kawalan kerana sistem akan memerhati ralat pada input pada semua sifat kawalan. Ralat itu tidak akan 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 supaya ia tidak akan mengembalikan ralat walaupun ralat dihantar ke dalamnya.

Memerhati ralat

Ralat tidak diperhatikan sehingga nilainya digunakan.

Hasilnya, fungsi If dan Select mungkin juga tidak mengembalikan ralat jika salah satu diluluskan. Pertimbangkan formula If( false, 1/0, 3 ). Terdapat ralat pembahagian dengan sifar dalam formula ini, tetapi oleh kerana If tidak mengambil cabang itu kerana false, Power Fx dan Power Apps tidak akan melaporkan ralat:

Tiada sepanduk ralat ditunjukkan dengan fungsi If dalam label Text sifat

Menggunakan fungsi Set dengan ralat tidak akan melaporkan ralat pada ketika ralat itu diletakkan ke dalam pemboleh ubah. Sebagai contoh dalam Power Apps, berikut adalah formula dalam App.OnStart yang meletakkan ralat pembahagian dengan sifar ke dalam pemboleh ubah x:

Tiada sepanduk ralat ditunjukkan dengan Setkan panggilan fungsi dalam App.OnStart

Tiada ralat dilaporkan kerana x tidak dirujuk. Walau bagaimanapun, ketika kita menambah kawalan label dan menetapkan sifat Text kepada x, ralat dipaparkan:

Sepanduk ralat ditunjukkan dengan kawalan label merujuk pemboleh ubah x

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

Melaporkan ralat

Selepas ralat diperhatikan, langkah seterusnya ialah untuk melaporkan ralat itu kepada pengguna akhir.

Tidak seperti Excel, tempat yang sesuai untuk menunjukkan hasil ralat tidak selalu ada, kerana hasil formula mungkin memacu sifat seperti koordinat X dan Y bagi kawalan yang tiada 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 telah disebarkan melalui formula lain. App.OnError hanya mengawal cara ralat dilaporkan kepada pengguna akhir dan menyediakan cangkuk untuk pembuat bagi mengelog ralat tersebut jika dikehendaki.

Skop pemboleh ubah FirstError dan AllErrors memberikan maklumat konteks tentang ralat atau ralat-ralat. Ini memberikan maklumat tentang jenis ralat dan tempat ralat itu berasal dan tempat 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 jujukan menggunakan ; operator perantaian (atau ;; bergantung pada penempatan).

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

Animasi menunjukkan dua rekod dalam jadual T sedang dikemas kini dengan nombor rawak selepas setiap butang klik

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:

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

IfError boleh digunakan 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:

Animasi menunjukkan tiada perubahan pada mana-mana rekod dalam jadual T, kerana IfError menghalang operasi kedua daripada melengkapkan selepas ralat

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

Sebagai contoh, formula berikut akan menyebabkan ForAll mengembalikan dua ralat (untuk pembahagian dengan sifar bagi Value 0, dua kali) dan Collection akan 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, ralat pertama dilaporkan kepada pengguna akhir. Dalam contoh ini, kedua-dua panggilan Patch akan gagal, kedua dengan ralat pembahagian dengan sifar. Hanya ralat pertama (perihal Indeks) ditunjukkan kepada pengguna:

Ralat indeks pertama dipaparkan dalam sepanduk ralat, ralat kedua tidak dilaporkan

Fungsi IfError dan App.OnError boleh mengakses semua ralat yang ditemui dengan pemboleh ubah skop AllErrors. Dalam hal ini, kita boleh menetapkan ini kepada pemboleh ubah global dan melihat kedua-dua ralat yang ditemui. Ia muncul dalam jadual dalam susunan yang sama di tempat ia ditemui:

Tangkap ralat ke dalam pemboleh ubah global PatchErrors di mana kita dapat melihat bahawa kedua-dua kesilapan hadir

Ralat berbilang boleh dikembalikan dalam formula bukan tingkah laku juga. 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 kita lihat sebelum ini, ralat boleh disimpan dalam pemboleh ubah. Ralat juga boleh disertakan dalam struktur data, seperti jadual. Ini penting supaya ralat pada mana-mana satu rekod tidak boleh membatalkan seluruh jadual.

Contohnya, pertimbangkan kawalan jadual data ini dalam Power Apps:

Jadual data menunjukkan ralat bagi medan Timbal Balik untuk input 0, yang mengakibatkan pembahagian dengan ralat sifar

Pengiraan dalam AddColumns telah menemui ralat pembahagian dengan 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 tetapi masih dikembalikan dalam hasil supaya pengguna akhir mengetahui sesuatu telah berlaku dan terdapat masalah.

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

Jadual data 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 bagi pengguna akhir dan membantu pembuat melakukan nyahpepijat, kami menyertakan 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 akan mengembalikan nilai ralat hasil daripada operasi itu. Ralat boleh dikesan dengan IsError dan digantikan atau disekat dengan IfError dan App.OnError seperti biasa.
  • Selepas operasi, fungsi Errors juga akan mengembalikan ralat untuk operasi sebelumnya. Ini berguna untuk memaparkan mesej ralat pada skrin borang tanpa perlu merekodkan ralat dalam pemboleh ubah keadaan.

Sebagai contoh, formula ini akan menyemak ralat daripada Collect 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 beberapa kemungkinan ralat dijangkakan dan boleh diabaikan dengan selamat. Dalam IfError dan App.OnError, jika ralat dikesan dan harus dihantar kepada pengendali lebih tinggi yang seterusnya, ia boleh dilempar semula dengan Error( AllErrors ).

Mencipta ralat anda sendiri

Anda juga boleh mencipta ralat anda sendiri dengan fungsi Error.

Jika anda mencipta ralat sendiri, anda disyorkan agar menggunakan nilai melebihi 1000 untuk mengelakkan kemungkinan konflik dengan nilai ralat sistem masa hadapan.

Nilai ErrorKind enum

ErrorKind enum Nilai Penerangan
AnalysisError 18 Ralat sistem. Terdapat masalah dengan analisis pengkompil.
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 dikemas kini telah pun ditukar di sumber dan konflik perlu diselesaikan. 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 Pengguna tidak mempunyai keizinan mencipta rekod untuk sumber data. Sebagai contoh, fungsi Collect telah dipanggil.
DeletePermissions 5 Pengguna tidak mempunyai keizinan memadam rekod untuk sumber data. Sebagai contoh, fungsi Remove telah dipanggil.
Div0 13 Pembahagian dengan sifar.
EditPermissions 4 Pengguna tidak mempunyai keizinan mencipta rekod untuk sumber data. Sebagai contoh, fungsi Patch telah dipanggil.
GeneratedValue 9 Nilai telah tersilap dihantar ke 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 Tiada 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. Berguna untuk membezakan nilai blank yang boleh dianggap sebagai sifar dalam pengiraan berangka daripada nilai kosong yang harus dibenderakan sebagai masalah yang berpotensi jika nilai itu 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 Pengguna tidak mempunyai keizinan baca rekod untuk sumber data.
Sync 1 Ralat dilaporkan oleh sumber data. Semak lajur Mesej untuk maklumat lanjut.
Unknown 12 Terdapat ralat, tetapi tidak diketahui jenis.
Validation 11 Rekod tidak menghantar semakan pensahihan.