Penanganan kesalahan
Catatan
Perilaku yang dijelaskan di artikel ini hanya tersedia bila fitur pratinjau Manajemen kesalahan tingkat rumus melalui pengaturan>Fitur mendatang>Pratinjau diaktifkan. Informasi selengkapnya: Mengontrol fitur yang diaktifkan
Kesalahan terjadi. Jaringan turun, penyimpanan penuh, aliran nilai tidak terduga masuk. Penting agar logika Anda terus berfungsi dengan benar dalam mengatasi masalah yang mungkin.
Secara default, kesalahan mengalir melalui rumus aplikasi dan dilaporkan ke pengguna akhir aplikasi. Dengan cara ini, pengguna akhir mengetahui sesuatu yang tidak terduga terjadi, mereka dapat berpotensi memperbaiki masalah mereka sendiri dengan input yang berbeda, atau mereka dapat melaporkan masalah tersebut kepada pemilik aplikasi.
Sebagai pembuat aplikasi, Anda dapat mengontrol kesalahan dalam aplikasi:
- Mendeteksi dan menangani kesalahan. Jika ada kemungkinan kesalahan terjadi, rumus aplikasi dapat ditulis untuk mendeteksi kondisi kesalahan dan mencoba lagi operasi. Pengguna akhir tidak perlu khawatir bahwa terjadi kesalahan karena pembuat mempertimbangkan kemungkinan tersebut. Hal ini dilakukan dengan fungsi IfError, IsError, dan IsErrorOrBlank dalam rumus.
- Pelaporan Kesalahan. Jika kesalahan tidak ditangani dalam rumus yang ditemuinya, kesalahan tersebut kemudian diangkat ke penanganan App.OnError. Di sini, kesalahan tidak dapat lagi tergantikan karena telah terjadi dan merupakan bagian dari perhitungan rumus. Namun Anda dapat menggunakan App.OnError untuk mengontrol cara melaporkan kesalahan kepada pengguna akhir, termasuk menekan pelaporan kesalahan secara bersamaan. App.OnError juga menyediakan titik tersedak umum untuk pelaporan kesalahan di seluruh aplikasi.
- Membuat dan membangun ulang kesalahan. Terakhir, Anda dapat mendeteksi kondisi kesalahan dengan logika Anda sendiri, kondisi yang khusus untuk aplikasi Anda. Gunakan fungsi Kesalahan untuk membuat kesalahan kustom. Fungsi Kesalahan juga digunakan untuk membuat ulang kesalahan setelah di intergasi di IfError atau App.OnError.
Persiapan
Mari mulai dengan contoh sederhana.
- Buat layar baru di aplikasi kanvas Power Apps.
- Masukkan kontrol TextInput. Ini akan default ke nama TextInput1.
- Masukkan kontrol label.
- Atur properti Teks dari kontrol label ke rumus
1/Value( TextInput1.Text )
Kami memiliki kesalahan karena teks default dari kontrol TextInput adalah "Text input"
, yang tidak dapat dikonversi ke angka. Secara default, hal ini adalah hal yang baik: pengguna akhir akan mendapatkan pemberitahuan bahwa ada sesuatu yang tidak berfungsi seperti yang diharapkan dalam aplikasi.
Jelas, kita tidak ingin kesalahan untuk mengucapkan selamat datang kepada pengguna setiap mereka menjalankan aplikasi ini. Kemungkinan "Text input"
bukan default yang tepat untuk kotak input teks. Untuk mengatasi ini, ubah properti Default kontrol TextInput ke:
Blank()
Hmm, sekarang kita memiliki kesalahan yang berbeda. Operasi logika dengan kosong, seperti pembagian, akan memaksa nilai kosong menjadi nol. Dan ini sekarang menyebabkan kesalahan pembagian dengan nol. Untuk mengatasi masalah ini, kita harus memutuskan perilaku yang sesuai untuk situasi ini di aplikasi ini. Jawaban mungkin ditampilkan kosong saat input teks kosong. Kita dapat mencapai hal ini dengan membungkus rumus kita dengan fungsi IfError:
IfError( 1/Value( TextInput1.Text ), Blank() )
Sekarang kesalahan ganti dengan nilai yang valid dan banner kesalahan telah hilang. Namun, kita mungkin memiliki overshot, IfDYor yang kita gunakan mencakup semua kesalahan, termasuk mengetik nilai yang buruk seperti "hello"
. Kita dapat mengatasi ini dengan memperbaiki IfError kita untuk menangani kasus pembagian dengan nol hanya dengan dan memunculkan semua kesalahan lain:
IfError( 1/Value( TextInput1.Text ),
If( FirstError.Kind = ErrorKind.Div0, Blank(), Error( FirstError ) ) )
Jadi, jalankan aplikasi kita dan coba beberapa nilai yang berbeda.
Tanpa nilai apa pun, saat aplikasi dimulai, tidak ada jawaban yang ditampilkan sebagai nilai default kosong, tetapi juga tidak ada kesalahan yang ditampilkan saat IfError mengganti kesalahan pembagian dengan nol.
Jika kita mengetik 4, kita mendapatkan hasil yang diharapkan 0,25:
Dan jika kita mengetik sesuatu yang tidak sah, seperti hello
, maka kita akan menerima banner kesalahan:
Ini adalah contoh introspektif sederhana. Penanganan kesalahan dapat dilakukan dengan berbagai cara, tergantung pada kebutuhan aplikasi:
- Alih-alih banner kesalahan, kita dapat menampilkan "#Error" pada kontrol label dengan rumus. Agar jenis penggantian tetap kompatibel dengan argumen pertama dengan IfError , kita harus mengkonversi secara eksplisit hasil numerik ke string teks dengan fungsi Teks.
IfError( Text( 1/Value( TextInput1.Text ) ), If( FirstError.Kind = ErrorKind.Div0, Blank(), "#Error" )
- Alih-alih membungkus instans khusus ini dengan IfError , kita mungkin telah menulis penanganan App.OnError terpusat. Kami tidak dapat mengganti string yang ditampilkan dengan "#Error" karena kesalahan telah terjadi dan App.OnError hanya diberikan untuk mengontrol pelaporan.
If( FirstError.Kind <> ErrorKind.Div0, Error( FirstError ) )
Memperbanyak kesalahan
Kesalahan mengalir melalui rumus seperti di Excel. Contohnya di Excel, jika sel A1
memiliki rumus =1/0
, maka A1 akan menampilkan nilai kesalahan #DIV0!
:
Jika sel A2
mengacu pada A1
dengan rumus seperti =A1*2
, maka kesalahan juga menyebarkan melalui rumus tersebut:
Kesalahan menggantikan nilai yang seharusnya dihitung. Tidak ada hasil untuk perkalian dalam sel A2
, hanya kesalahan dari pembagian di A1
.
Power Fx berfungsi dengan cara yang sama. Secara umum, jika kesalahan diberikan sebagai argumen ke fungsi atau operator, operasi tidak akan terjadi dan kesalahan input akan mengalir sebagai hasil dari operasi. Contohnya, Mid( Text( 1/0 ), 1, 1 )
akan menghasilkan kesalahan Pembagian dengan nol, karena kesalahan paling banyak di dalam diteruskan melalui fungsi Teks dan Mid:
Secara umum, kesalahan tidak mengalir melalui properti kontrol Power Apps. Perluas contoh sebelumnya dengan kontrol tambahan yang ditampilkan jika properti Text
label pertama adalah status kesalahan:
Tidak masalah jika kesalahan tidak disebar melalui kontrol karena sistem akan mengamati kesalahan pada input untuk semua properti kontrol. Kesalahan tidak akan hilang.
Sebagian besar fungsi dan operator mengikuti aturan "kesalahan masuk, kesalahan keluar", namun ada beberapa pengecualian. Fungsi IsError, IsErrorOrBlank, dan IfError dirancang untuk menangani kesalahan sehingga mereka tidak dapat menghasilkan kesalahan meskipun salah satu dilewatkan ke dalamnya.
Mengamati kesalahan
Kesalahan tidak teramati hingga nilainya digunakan.
Hasilnya, fungsi Jika dan Pilih juga tidak menghasilkan kesalahan jika diteruskan. Masukkan rumus If( false, 1/0, 3 )
. Ada kesalahan pembagian dengan nol dalam rumus ini, tetapi karena If
cabang tidak mengambil cabang tersebut karena false
, Power Fx dan Power Apps tidak akan melaporkan kesalahan:
Menggunakan fungsi Set dengan kesalahan tidak akan melaporkan kesalahan pada titik kesalahan diletakkan ke variabel. Contohnya, Power Apps di sini adalah rumus di App.OnStart yang menempatkan kesalahan pembagian dengan nol ke variabel x
:
Tidak ada kesalahan yang dilaporkan, karena x
tidak direferensikan. Namun, saat kita menambahkan kontrol Label, dan mengatur properti Teks-nya ke x
, kesalahan ditampilkan;
Anda dapat mengamati kesalahan dalam rumus dengan fungsi IfError, IsError, dan IsErrorOrBlank. Dengan fungsi ini, Anda dapat menghasilkan nilai alternatif, melakukan tindakan alternatif, atau memodifikasi kesalahan sebelum teramati dan dilaporkan.
Melaporkan Kesalahan
Setelah kesalahan teramati, langkah berikutnya adalah melaporkan kesalahan tersebut ke pengguna akhir.
Tidak seperti Excel, tidak selalu ada tempat yang nyaman untuk menampilkan hasil kesalahan, karena hasil rumus dapat mendorong properti seperti koordinat X dan Y dari kontrol yang mana tidak ada tempat mudah untuk menampilkan teks. Setiap host Power Fx mengontrol cara menampilkan kesalahan pada akhirnya kepada pengguna akhir dan seberapa besar kontrol yang dilakukan pembuat atas proses ini. Pada Power Apps, banner kesalahan ditampilkan dan App.OnError digunakan untuk mengontrol cara kesalahan dilaporkan.
Perlu diketahui bahwa App.OnError tidak dapat mengganti kesalahan dengan cara yang sama seperti yang dapat dilakukan IfError . Pada titik App.OnError dijalankan, kesalahan telah terjadi, dan hasilnya telah disebarkan melalui rumus lain. App.OnError hanya mengontrol bagaimana kesalahan dilaporkan ke pengguna akhir dan menyediakan pengait bagi pembuat untuk mencatat kesalahan jika diinginkan.
Variabel cakupan FirstError dan AllErrors memberikan informasi konteks tentang kesalahan atau kesalahan-kesalahan. Ini memberikan Informasi tentang jenis kesalahan dan asal kesalahan dan tempat teramatinya.
Berhenti setelah kesalahan
Rumus perilaku mendukung mengambil tindakan, memodifikasi database, dan mengubah status. Rumus ini memungkinkan lebih dari satu tindakan dilakukan secara berurutan menggunakan operator rangkaian ;
(atau ;;
tergantung lokal).
Di kasus ini, misalnya, kontrol kisi menampilkan yang ada di tabel T
. Setiap tombol memilih perubahan status di tabel ini dengan dua panggilan Patch :
Dalam rumus perilaku berantai, tindakan tidak berhenti setelah kesalahan pertama. Mari modifikasikan contoh kita untuk melewatkan nomor indeks tidak valid pada panggilan Patch pertama. Patch kedua berlanjut meskipun terjadi kesalahan sebelumnya. Kesalahan pertama dilaporkan ke pengguna akhir, dan ditampilkan sebagai kesalahan di Studio pada kontrol:
IfError dapat digunakan untuk menghentikan eksekusi setelah kesalahan. Mirip dengan fungsi If, argumen ketiga terhadap fungsi ini menyediakan tempat untuk menempatkan tindakan yang harus dijalankan hanya jika tidak ada kesalahan:
Jika kesalahan terjadi selama salah satu iterasi ForAll, iterasi lainnya tidak akan berhenti. ForAll dirancang untuk mengeksekusi setiap iterasi secara independen, memungkinkan eksekusi paralel. Setelah ForAll selesai, kesalahan akan dihasilkan, yang berisi semua kesalahan yang dihadapi (dengan memeriksa AllErrors di IfError atau App.OnError).
Contohnya, rumus berikut akan mengakibatkan ForAll menghasilkan dua kesalahan (untuk pembagian dengan nol untuk Value
dari 0, dua kali) dan Collection
akan memiliki tiga rekaman (untuk ketika Value
tidak 0): [1, 2, 3]
.
Clear( Collection );
ForAll( [1,0,2,0,3], If( 1/Value > 0, Collect( Collection, Value ) ) );
Menangani beberapa kesalahan
Karena rumus perilaku dapat mengeksekusi lebih dari satu tindakan, rumus ini juga dapat menemui lebih dari satu kesalahan.
Secara default, kesalahan pertama dilaporkan ke pengguna akhir. Dalam contoh ini, panggilan Patch akan gagal, yang kedua dengan kesalahan pembagian dengan nol. Hanya kesalahan pertama (tentang indeks) yang ditampilkan ke pengguna:
Fungsi IfError dan App.OnError dapat mengakses semua kesalahan yang dihadapi dengan variabel cakupan AllErrors. Di kasus ini, kita dapat mengaturnya ke variabel global dan melihat kedua kesalahan yang terjadi. Semua itu muncul di tabel dalam urutan yang sama mereka ditemui:
Beberapa kesalahan dapat dihasilkan dalam rumus non-perilaku juga. Contohnya, menggunakan fungsi Patch dengan kumpulan rekaman untuk diperbarui dapat menghasilkan beberapa kesalahan, satu untuk setiap rekaman yang gagal.
Kesalahan dalam tabel
Seperti yang kita lihat sebelumnya, kesalahan dapat disimpan dalam variabel. Kesalahan juga dapat tercakup dalam struktur data, seperti tabel. Hal ini penting agar kesalahan pada salah satu rekaman tidak dapat membatalkan seluruh tabel.
Contohnya, pertimbangkan kontrol tabel data ini di Power Apps:
Penghitungan di AddColumns telah menemui kesalahan pembagian dengan nol untuk salah satu nilai. Untuk rekaman yang satu ini, kolom Timbal Balik memiliki nilai kesalahan (pembagian dengan nol) namun rekaman lain tidak demikian dan baik-baik saja. IsError( Index( output, 2 ) )
mengembalikan false dan IsError( Index( output, 2 ).Value )
mengembalikan true.
Jika kesalahan terjadi saat memfilter tabel, seluruh rekaman merupakan kesalahan namun tetap memberikan hasil sehingga pengguna akhir mengetahui ada sesuatu dan ada masalah.
Misalnya contoh ini. Di sini, tabel asli tidak memiliki kesalahan, namun tindakan pemfilteran membuat kesalahan bila Nilai sama dengan 0:
Nilai -5 dan -3 difilter dengan benar. Nilai 0 mengakibatkan kesalahan dalam memproses filter, jadi tidak jelas apakah rekaman harus disertakan atau tidak dalam hasilnya. Untuk memaksimalkan transparansi bagi pengguna akhir dan membantu debug oleh pembuat, kami menyertakan rekaman kesalahan sebagai ganti yang asli. Dalam kasus ini, IsError( Index( output, 2 ) )
menghasilkan true.
Kesalahan sumber data
Fungsi yang memodifikasi data dalam sumber data, seperti Patch, Collect, Remove, RemoveIf, Update, UpdateIf, and SubmitForm melaporkan kesalahan dalam dua cara:
- Setiap fungsi ini akan menghasilkan nilai kesalahan sebagai hasil dari operasi. Kesalahan dapat terdeteksi dengan Is Errors dan mengganti atau diredam dengan IfError dan App.OnError seperti biasa.
- Setelah operasi, fungsi Errors juga akan mengembalikan kesalahan untuk operasi sebelumnya. Ini dapat berguna untuk menampilkan pesan kesalahan pada layar formulir tanpa harus mengambil kesalahan dalam variabel status.
Contohnya, rumus ini akan memeriksa kesalahan dari Collect dan menampilkan pesan kesalahan kustom:
IfError( Collect( Names, { Name: "duplicate" } ),
Notify( $"OOPS: { FirstError.Message }", NotificationType.Warning ) )
Fungsi Errors juga menghasilkan informasi tentang kesalahan sebelumnya selama operasi runtime. Ini dapat berguna untuk menampilkan kesalahan pada layar formulir tanpa harus mengambil kesalahan dalam variabel status.
Membuat ulang kesalahan
Terkadang, beberapa kemungkinan kesalahan terjadi dan dapat diabaikan dengan aman. Di dalam IfError dan App.OnError, jika kesalahan terdeteksi yang harus diteruskan ke penanganan yang lebih tinggi berikutnya, ia dapat dimunculkan lagi dengan Error( AllErrors )
.
Membuat kesalahan Anda sendiri
Anda juga dapat membuat kesalahan sendiri dengan fungsi Error.
Jika Anda membuat kesalahan sendiri, sebaiknya gunakan nilai di atas 1000 untuk menghindari kemungkinan konflik dengan nilai kesalahan sistem di masa mendatang.
Nilai enum ErrorKind
enum ErrorKind | Nilai | Description |
---|---|---|
AnalysisError | 18 | Kesalahan Sistem. Ada masalah dengan analisis compiler. |
BadLanguageCode | 14 | Kode bahasa yang tidak valid atau tidak dikenal digunakan. |
BadRegex | 15 | Ekspresi reguler tidak valid. Periksa sintaks yang digunakan dengan fungsi IsMatch, Match, atau MatchAll. |
Konflik | 6 | Rekaman yang sedang diperbarui telah diubah pada sumber dan konflik harus diselesaikan. Solusi umum adalah menyimpan perubahan lokal, me-refresh rekaman, dan menerapkan ulang perubahan. |
ConstraintViolated | 8 | Rekaman tidak melewati pemeriksaan batasan di server. |
CreatePermission | 3 | Pengguna tidak memiliki izin membuat rekaman untuk sumber data. Misalnya, fungsi Collect dipanggil. |
DeletePermissions | 5 | Pengguna tidak memiliki izin menghilangkan rekaman untuk sumber data. Misalnya, fungsi Remove dipanggil. |
Div0 | 13 | Pembagian dengan nol. |
EditPermissions | 4 | Pengguna tidak memiliki izin membuat rekaman untuk sumber data. Misalnya, fungsi Patch dipanggil. |
GeneratedValue | 9 | Nilai dilewatkan secara tidak tepat ke server untuk bidang yang secara otomatis dihitung oleh server. |
InvalidFunctionUsage | 16 | Penggunaan fungsi tidak valid. Sering kali satu atau beberapa argumen terhadap fungsi salah atau digunakan dengan cara yang tidak valid. |
FileNotFound | 17 | penyimpanan SaveData tidak dapat ditemukan. |
InsufficientMemory | 21 | Memori atau penyimpanan di perangkat tidak memadai untuk pengoperasiannya. |
InvalidArgument | 25 | Argumen tidak valid diteruskan ke fungsi. |
Internal | 26 | Kesalahan Sistem. Ada masalah internal dengan salah satu fungsi. |
MissingRequired | 2 | Bidang rekaman yang diperlukan tidak ada. |
Jaringan | 23 | Terjadi masalah dengan komunikasi jaringan. |
Tidak ada | 0 | Kesalahan Sistem. Tidak ada kesalahan. |
Tidak Berlaku | 27 | Nilai tidak tersedia. Berguna untuk membedakan nilai kosong yang dapat dianggap sebagai nol dalam perhitungan numerik dari nilai kosong yang harus ditandai sebagai potensi masalah jika nilai digunakan. |
NotFound | 7 | Rekaman tidak dapat ditemukan. Contohnya, rekaman yang akan dimodifikasi pada fungsi Patch. |
NotSupported | 20 | Operasi tidak didukung oleh pemutar atau perangkat ini. |
Numerik | 24 | Fungsi numerik digunakan dengan cara yang tidak semestinya. Misalnya, Sqrt dengan -1. |
QuoteExceeded | 22 | Kuota penyimpanan terlampaui. |
ReadOnlyValue | 10 | Kolom hanya dapat dibaca dan tidak dapat dimodifikasi. |
ReadPermission | 19 | Pengguna tidak memiliki izin membaca rekaman untuk sumber data. |
Sinkronkan | 1 | Kesalahan dilaporkan oleh sumber data. Periksa kolom Pesan untuk informasi lebih lanjut. |
Tidak diketahui | 12 | Ada kesalahan, namun dari jenis yang tidak diketahui. |
Validasi | 11 | Rekaman tidak melewati pemeriksaan validasi. |