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 tercekik biasa untuk pelaporan ralat merentas keseluruhan apl.
- 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.
- Cipta skrin baharu dalam aplikasi Kanvas Power Apps.
- Masukkan kawalan TextInput. Ia akan menjadi lalai kepada nama TextInput1.
- Sisipkan kawalan Label.
- Tetapkan sifat Text bagi kawalan Label kepada formula
1/Value( TextInput1.Text )
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()
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() )
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 ) ) )
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.
Jika kita menaip masuk 4, kita mendapat hasil yang dijangkakan sebanyak 0.25:
Jika kita menaip masuk sesuatu yang tidak sah, seperti hello
, maka kita akan menerima sepanduk ralat:
Ini ialah contoh pengenalan yang mudah. Pengendalian ralat boleh dilakukan dengan pelbagai cara, bergantung pada keperluan aplikasi:
- 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" )
- 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!
:
Jika sel A2
merujuk pada A1
dengan formula seperti =A1*2
, maka ralat tersebar melalui formula itu juga:
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:
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:
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:
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 ralat dilaporkan kerana x
tidak dirujuk. Walau bagaimanapun, ketika kita menambah kawalan label dan menetapkan sifat Text kepada x
, ralat dipaparkan:
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 mencatat ralat 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:
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:
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:
Jika ralat ditemui semasa salah satu lelaran ForAll, lelaran selebihnya tidak akan berhenti. ForAll direka bentuk untuk melaksanakan setiap lelaran secara bebas, 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:
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:
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:
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 false dan IsError( Index( output, 2 ).Value )
mengembalikan true.
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:
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. |